3

データの3D配列があります。インデックスの2D配列があり、形状はデータ配列の最初の2次元と一致し、データ配列から取得して2D配列を作成するインデックスを指定します。例えば:

 from numpy import *
 a = arange(3 * 5 * 7).reshape((3,5,7))
 getters = array([0,1,2] * (5)).reshape(3,5)

私が探しているのは、a[:, :, getters]各アイテムの3次元に個別にインデックスを付けることで、形状の配列(3,5)を返すような構文です。ただし、a[:, :, getters]形状の配列(3,5,3,5)を返します。新しい配列を繰り返して構築することでそれを行うことができますが、これはかなり遅いです:

 array([[col[getters[ri,ci]] for ci,col in enumerate(row)] for ri,row in enumerate(a)])
 # gives array([[  0,   8,  16,  21,  29],
 #    [ 37,  42,  50,  58,  63],
 #    [ 71,  79,  84,  92, 100]])

きちんとした+速い方法はありますか?

4

1 に答える 1

3

私があなたを正しく理解しているなら、私は派手な索引付けを使用してこのようなことをしました:

>>> k,j = np.meshgrid(np.arange(a.shape[1]),np.arange(a.shape[0]))
>>> k
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])
>>> j
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])
>>> a[j,k,getters]
array([[  0,   8,  16,  21,  29],
       [ 37,  42,  50,  58,  63],
       [ 71,  79,  84,  92, 100]])

もちろん、あなたはそれらを好きなだけ維持kjて使用することができます。以下のコメントでDSMが指摘しているように、j,k = np.indices(a.shape[:2])の代わりにも機能するはずですmeshgrid。どちらが(明らかに)速いかは、使用している要素の数によって異なります。

于 2012-11-06T17:00:32.540 に答える