我需要为一个具有通用/可变维数的数组生成一个网格。在2D的情况下,我知道我可以使用mgrid:
一些2D数据
N = 1000
x = np.random.uniform(0., 1., N)
y = np.random.uniform(10., 100., N)
xmin, xmax, ymin, ymax = x.min(), x.max(), y.min(), y.max()
获得2D网格
xy_grid = np.mgrid[xmin:xmax:10j, ymin:ymax:10j]
当维度数量可变时,我如何缩放这种方法?Ie:我的数据可以是(x,y(或(x,y,z(或(x,y,z,q(等。
的天真方法
Md_data.shape=(M,N(,对于M个维度
dmin, dmax = np.amin(Md_data, axis=1), np.amax(Md_data, axis=1)
Md_grid = np.mgrid[dmin:dmax:10j]
不起作用
meshgrid
作为一个函数允许我们使用'*'开箱:
In [412]: dmin,dmax=np.array([1,2,3]), np.array([5,6,7])
In [423]: arr = np.linspace(dmin,dmax,5)
In [424]: arr
Out[424]:
array([[1., 2., 3.],
[2., 3., 4.],
[3., 4., 5.],
[4., 5., 6.],
[5., 6., 7.]])
我使用sparse
来实现更紧凑的显示器。
In [425]: atup = np.meshgrid(*arr.T,indexing='ij',sparse=True)
In [426]: atup
Out[426]:
[array([[[1.]],
[[2.]],
[[3.]],
[[4.]],
[[5.]]]),
array([[[2.],
[3.],
[4.],
[5.],
[6.]]]),
array([[[3., 4., 5., 6., 7.]]])]
这个ogrid
做了同样的事情:
np.ogrid[1:5:5j,2:6:5j,3:7:5j]
仔细想想,也是
np.ix_(arr[:,0],arr[:,1],arr[:,2])
尽管它没有CCD_ 4替代方案。