我想设计一个具有n个维度的网格,二维的解决方案是可用的,但我想要Numpy中的n个维度



我需要为一个具有通用/可变维数的数组生成一个网格。在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替代方案。

相关内容

最新更新