30

グリッドに対応するポイントのリストを作成したいと考えています。したがって、 から(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]])

私の質問は 2 つあります。

  1. これを行うより良い方法はありますか?
  2. これを高次元に一般化する方法はありますか?
4

5 に答える 5

54

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
于 2012-10-15T08:11:37.917 に答える
17

グリッドポイントは常に積分されていますか? もしそうなら、あなたは使うことができますnumpy.ndindex

print list(np.ndindex(2,2))

高次元:

print list(np.ndindex(2,2,2))

残念ながら、積分仮定 (0 から始まる) が満たされていないため、これは OP の要件を満たしていません。他の誰かがこれらの仮定が当てはまる同じものを探している場合にのみ、この回答を残します。


これを行う別の方法は、以下に依存していますzip

g = np.meshgrid([0,1],[0,1])
zip(*(x.flat for x in g))

この部分は、任意の次元に適切にスケーリングされます。残念ながら、np.meshgrid複数の次元にうまくスケーリングできないため、その部分を解決する必要があります。または (機能すると仮定して)、このSO の回答を使用して独自の ndmeshgrid 関数を作成することもできます。

于 2012-10-12T17:48:06.223 に答える
5

それを行うさらに別の方法は次のとおりです。

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]])
于 2014-02-26T14:25:45.880 に答える