2016-06-25 25 views
5

私は配列を持っている:numpyでインデックスで配列を累積する方法は?

a = np.array([0,0,0,0,0,0]) 

私は、インデックスが複数回現れることができますが、それぞれの指標の中にいくつかの他のアレイを追加したいです。私は各インデックスのいくつかを取得したい。

a[np.array([1,2,2,1,3])] += np.array([1,1,1,1,1]) 

をしかしであることを得る:私は書く

array([0, 1, 1, 1, 0, 0]) 

しかし、私が望むことは得ることです:

array([0, 2, 2, 1, 0, 0]) 

forループせずにnumpyの中でこれを実装する方法は?

答えて

9

は純粋numpyを使用して、ループのための回避:

np.add.at(a, np.array([1,2,2,1,3]), np.array([1,1,1,1,1])) 

出力:

>>> a = np.array([0,0,0,0,0,0]) 
>>> np.add.at(a, np.array([1,2,2,1,3]), np.array([1,1,1,1,1])) 
>>> a 
array([0, 2, 2, 1, 0, 0]) 

注意してください、これはインプレースの置換を行います。これはあなたが望むものですが、将来の視聴者には望ましくないかもしれません。したがって、ノート:

+1

私も 'np.add.reduceat'を見ましたが、私は' ufunc'メソッドであまり時間を費やしていないので、私はそれらのほとんどを知らないのです。 [documentation](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.at.html)ここでも完璧です... "ufuncを追加する場合、このメソッドは[インデックス] + = b、複数のインデックスが付けられた要素に対して結果が累積される点を除いて " – mgilson

+1

ありがとうございます。 – maple

1

あなたはいつでも自分自身を繰り返すことができます。ような何か:

for i in [1,2,2,1,3]: 
    a[i] += 1 
+1

ありがとうが、私はループのために避けたい。 – maple

1

私はこれを行うための巧妙なnumpyのベクトル化された方法を知っていません...私が思い付くことができる最高は次のとおりです。

>>> indices = np.array([1,2,2,1,3]) 
>>> values = np.array([1,1,1,1,1]) 
>>> a = np.array([0,0,0,0,0,0]) 
>>> for i, ix in enumerate(indices): 
... a[ix] += values[i] 
... 
>>> a 
array([0, 2, 2, 1, 0, 0]) 
+0

ありがとうございますが、forループを避けたいです。 – maple

+2

@maple - 私はそれを理解していますが、それを行う方法はわかりません。もちろん、それはそれをする方法ではないと言っているわけではありません。いずれにしても、正しい(作業中の)コードの例を持つことがあると、他の人が問題をよりよく解消するために問題を明らかにするには十分です。 – mgilson

+0

@mapleあなたがそれをする方法を知りたいなら、私の答えをチェックしてください。ありがとう。問題を解決するためにさまざまな方法で例を挙げることに私は完全に同意しますが。 – oxalorg

1

あなたは(は仮定のような何かを行うことができます各インデックスの相関値)がある:

a = np.array([0,0,0,0,0,0]) 
idxs = np.array([1,2,2,1,3]) 
vals = np.array([1,1,1,1,1]) 
for idx, val in zip(idxs,vals): 
    a[idx] += val 
関連する問題