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 倍高速です。
ソース: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html#scipy.stats.gaussian_kde
2 つの方法を比較するには、コードの次のセクションを検討してください。
グリッドの作成に役立つことわざの目盛りを作成します。
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 がメッシュグリッドにリンクした関数を定義します。
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)
グリッドを作成し、2 つの関数の時間を計ります。
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