5

numpy.mgrid「座標インデックス配列」を生成するために使用します

y, x = np.mgrid[0:3, 0:2]
print x
array([[0, 1],
       [0, 1],
       [0, 1]])

多くの場合、これらの配列(たとえばx[0, :])をスライスして、残りのデータを破棄します。場合によっては、これらのスライスは元の配列よりもはるかに小さく、計算にコストがかかります(つまりnp.mgrid[0:512, 0:512, 0:512])。numpyは、[coord[view] for coord in np.mgrid[0:512, 0:512, 0:512]大きな中間配列を生成しないのと同等のものを提供しますか?

解決策はスライスにとって些細なこと[0,:]だと思いますが、numpy配列にインデックスを付けるための有効な方法を処理する一般的な解決策を探しています

編集

一部の人は、どのviewように見えるかについて具体的な例を求めています。理想的には、ndarrayにインデックスを付けるための有効な方法を処理する一般的なソリューションを望んでいます。上記の3x2アレイの具体例を次に示します。

1)view = (1, slice(None, None, 2))

2)view = (np.array([0,1]), np.array([0, 1]))

3)view = np.array([[False, False], [False, True], [False, False]])

そして、私は次のような関数を探しています

def mgrid_with_view(array_shape, view)
    ...

[o[view] for o in np.indices(array_shape)]これは、不要な計算やメモリなしで同等のものを返します。

4

1 に答える 1

1

HYRYが述べたように、避けたいのは完全な配列を作成することだと思います。mgridただし、次を使用すると、完全な配列が作成されます。

x, y = np.broadcast_arrays(*np.ogrid[0:2,0:3])

xそして、それぞれが完全な配列であるかのように動作しながら、それ以降(および)yメモリを消費しません。単一の大きな結果配列が必要な場合は、これらの配列を個別にスライスしてから連結する必要があります。(np.broadcast_arraysは、配列ではなく配列のタプルを返します)np.arange(0,2)np.arange(0,3)

于 2012-08-20T08:54:23.083 に答える