2

2 次元の numpy 配列 (MxN) と、合計したい 2 次元配列の各行の開始インデックスと終了インデックスを表す 2 つの 1 次元配列 (Mx1) があります。これを大きな配列で行う最も効率的な方法を探しています(できれば、現在行っているループを使用する必要はありません)。私がやりたいことの例は次のとおりです。

>>> random.seed(1234)
>>> a = random.rand(4,4)
>>> print a
[[ 0.19151945  0.62210877  0.43772774  0.78535858]
 [ 0.77997581  0.27259261  0.27646426  0.80187218]
 [ 0.95813935  0.87593263  0.35781727  0.50099513]
 [ 0.68346294  0.71270203  0.37025075  0.56119619]]
>>> b = array([1,0,2,1])
>>> c = array([3,2,4,4])
>>> d = empty(4)
>>> for i in xrange(4):
    d[i] = sum(a[i, b[i]:c[i]]) 

>>> print d
[ 1.05983651  1.05256841  0.8588124   1.64414897]

私の問題は次の質問に似ていますが、そこで提示された解決策はあまり効率的ではないと思います。その質問では、同じ行の複数のサブセットの合計を見つけたいので、cumsum()使用できます。ただし、行ごとに 1 つの合計しか見つけられないため、これが合計を計算する最も効率的な方法になるとは思いません。

編集:申し訳ありませんが、コードに誤りがありました。以前に読み取ったループ内の行d[i] = sum(a[b[i]:c[i]])。最初の次元のインデックスを忘れました。開始インデックスと終了インデックスの各セットは、2 次元配列の新しい行に対応します。

4

1 に答える 1

2

あなたはこのようなことをすることができます:

from numpy import array, random, zeros
random.seed(1234)
a = random.rand(4,4)
b = array([1,0,2,1])
c = array([3,2,4,4])

lookup = zeros(len(a) + 1, a.dtype)
lookup[1:] = a.sum(1).cumsum()
d = lookup[c] - lookup[b]
print d

これは、b / c配列が大きく、合計するウィンドウが大きい場合に役立つことがあります。たとえば、2:4と1:4はほとんど同じであるため、ウィンドウが重なる可能性があるため、基本的に操作を繰り返します。cumsumを処理ごとのステップとして使用することにより、繰り返される操作の数を減らし、時間を節約できます。ウィンドウが小さく、b / cが小さい場合、これはあまり役に立ちません。これは主に、あまり気にしない行列の部分を合計するためです。お役に立てば幸いです。

于 2012-11-20T16:59:11.147 に答える