numpy - python Numpy meshgrid

  显示原文与译文双语对照的内容

我想创建与网格对应的点的列表。 因这里,如果我想要从( 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]])



我的问题是双重的:

  • 有更好的方法来做这个?
  • 是否可以将这里方法推广到更高的维度?
时间: 原作者:

我只是注意到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))



它的结果是比zip的压缩方法快 35倍,每个轴上有 1000个刻度。

源:http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html#scipy.stats.gaussian_kde

要比较这两种方法,请考虑以下代码部分:

创建将有助于创建网格的已知刻度线。


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



原作者:
...