4

私は 3D Numpy 配列を持っており、他の 2 つの次元からの特定の要素を考慮して、1 つの軸の平均を取りたいと考えています。

これは私の問題を描いたコード例です:

import numpy as np
myarray = np.random.random((5,10,30))
yy = [1,2,3,4]
xx = [20,21,22,23,24,25,26,27,28,29]
mymean = [ np.mean(myarray[t,yy,xx]) for t in np.arange(5) ]

ただし、これにより次の結果が得られます。

ValueError: shape mismatch: objects cannot be broadcast to a single shape

myarray[:,[1,2,3,4],[1,2,3,4]] などのインデックス付けが機能するのに、上記のコードが機能しないのはなぜですか?

4

3 に答える 3

4

これは、複数の次元でファンシー インデックスを作成する方法です。

>>> np.mean(myarray[np.arange(5)[:, None, None], np.array(yy)[:, None], xx],
            axis=(-1, -2))
array([ 0.49482768,  0.53013301,  0.4485054 ,  0.49516017,  0.47034123])

ファンシーなインデックス付け、つまりリストまたは配列をインデックスとして使用する場合、複数の次元にわたって、numpy はそれらの配列を共通の形状にブロードキャストし、それらを使用して配列にインデックスを付けます。ブロードキャストが適切に機能するためには、長さ 1 の余分な次元を最初のインデックス配列の最後に追加する必要があります。ゲームのルールは次のとおりです。

于 2013-08-27T15:40:19.337 に答える
3

連続した要素を使用するため、スライスを使用できます。

import numpy as np
myarray = np.random.random((5,10,30))
yy = slice(1,5)
xx = slice(20, 30)
mymean = [np.mean(myarray[t, yy, xx]) for t in np.arange(5)]
于 2013-08-27T15:38:33.823 に答える