我想创建与网格对应的点列表。因此,如果我想创建从(0,0)到(1,1)的区域网格,它将包含点(0,0),(0,1),(1,0),(1, 0)。
我知道可以使用以下代码完成此操作:
g = np.meshgrid([0,1],[0,1])
np.append(g[0].reshape(-1,1),g[1].reshape(-1,1),axis=1)
产生结果:
array([[0, 0],
[1, 0],
[0, 1],
[1, 1]])
我的问题有两个:
答案 0 :(得分:31)
我刚刚注意到numpy中的文档提供了一种更快的方法:
X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([X.ravel(), Y.ravel()])
使用链接的meshgrid2函数并将“ravel”映射到生成的网格,可以很容易地将其推广到更多维度。
g = meshgrid2(x, y, z)
positions = np.vstack(map(np.ravel, g))
对于每个轴上有1000个刻度的3D阵列,结果比zip方法快35倍。
要比较这两种方法,请考虑以下代码部分:
创建有助于创建网格的众所周知的刻度线。
In [23]: import numpy as np
In [34]: from numpy import asarray
In [35]: x = np.random.rand(100,1)
In [36]: y = np.random.rand(100,1)
In [37]: z = np.random.rand(100,1)
定义mgilson链接到meshgrid的函数:
In [38]: def meshgrid2(*arrs):
....: arrs = tuple(reversed(arrs))
....: lens = map(len, arrs)
....: dim = len(arrs)
....: sz = 1
....: for s in lens:
....: sz *= s
....: ans = []
....: for i, arr in enumerate(arrs):
....: slc = [1]*dim
....: slc[i] = lens[i]
....: arr2 = asarray(arr).reshape(slc)
....: for j, sz in enumerate(lens):
....: if j != i:
....: arr2 = arr2.repeat(sz, axis=j)
....: ans.append(arr2)
....: return tuple(ans)
创建网格并计算两个函数的时间。
In [39]: g = meshgrid2(x, y, z)
In [40]: %timeit pos = np.vstack(map(np.ravel, g)).T
100 loops, best of 3: 7.26 ms per loop
In [41]: %timeit zip(*(x.flat for x in g))
1 loops, best of 3: 264 ms per loop
答案 1 :(得分:14)
你的网格点总是不可分割的吗?如果是这样,您可以使用numpy.ndindex
print list(np.ndindex(2,2))
更高的尺寸:
print list(np.ndindex(2,2,2))
不幸的是,这不符合OP的要求,因为不满足积分假设(从0开始)。我会留下这个答案,以防其他人在寻找那些假设属实的事情。
另一种方法是依靠zip
:
g = np.meshgrid([0,1],[0,1])
zip(*(x.flat for x in g))
这部分很好地适应任意尺寸。不幸的是,np.meshgrid
无法很好地扩展到多个维度,因此需要解决该部分,或者(假设它有效),您可以使用此SO answer来创建自己的ndmeshgrid函数。 / p>
答案 2 :(得分:1)
另一种方法是:
np.indices((2,2)).T.reshape(-1,2)
可以推广到更高的维度,例如:
In [60]: np.indices((2,2,2)).T.reshape(-1,3)
Out[60]:
array([[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[1, 1, 0],
[0, 0, 1],
[1, 0, 1],
[0, 1, 1],
[1, 1, 1]])
答案 3 :(得分:0)
一个简单的 3D 示例(我猜可以扩展到 N 维,但要注意最终的维度和 RAM 使用情况):
import numpy as np
ndim = 3
xmin = 0.
ymin = 0.
zmin = 0.
length_x = 1000.
length_y = 1000.
length_z = 50.
step_x = 1.
step_y = 1.
step_z = 1.
x = np.arange(xmin, length_x, step_x)
y = np.arange(ymin, length_y, step_y)
z = np.arange(zmin, length_z, step_z)
%timeit xyz = np.array(np.meshgrid(x, y, z)).T.reshape(-1, ndim)
输入:2.76 s ± 185 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
产生:
In [2]: xyx
Out[2]:
array([[ 0., 0., 0.],
[ 0., 1., 0.],
[ 0., 2., 0.],
...,
[999., 997., 49.],
[999., 998., 49.],
[999., 999., 49.]])
In [4]: xyz.shape
Out[4]: (50000000, 3)
Python 3.6.9
麻木:1.19.5