2012-03-20 19 views
11

私の質問は、numpyを使って表現したい特定の配列操作についてです。インデックス配列を使って別の配列に1つの配列を累積するNumpy

私はwとしてフロートwと同じ長さの指標idxの配列の配列を持っていると私は同じidx値を持つすべてのwを総括し、配列vでそれらを収集します。 ループのように、これは次のようになります。

for i, x in enumerate(w): 
    v[idx[i]] += x 

は、配列操作でこれを行う方法はありますか? 私の推測はv[idx] += wでしたが、idxに同じインデックスが複数回含まれているため、それは機能しません。

ありがとうございます!

+0

*アトミック*は本当にあなたがしたいことについて不適切な記述です。 – Constantinius

+0

あなたはどのようにそれを記述しますか?希望は新しいタイトルが良いです。 –

+1

@ Constantinius、彼は彼が尋ねた質問のうち1つを除いてすべての答えを受け入れましたが、それは良いものの、彼の実際の問題に対処していない1つの回答でした。おそらく、あなたはこのサイトのゲーム面に注意を向けないようにしなければなりません。 –

答えて

15

numpy.bincountは、この目的のために導入されました:

tmp = np.bincount(idx, w) 
v[:len(tmp)] += tmp 

私は1.6のようあなたもbincountにMINLENGTHを渡すことができると思います。

+0

私はbincountを認識していましたが、私はそれが体重を扱うことができませんでした!素晴らしいです:) –

+0

クール、ほとんどこの小さなエルフを忘れてください。 – nye17

+0

今日の残りの部分のために私のヒーローとして感じるように自由に感じてください:) –

4

これは既知の動作ですが、多少不幸なことですが、numpyレベルの回避策はありません。 (腕をねじれば、bincountがこれに使用できます)。自分でループを実行するのが本当にベストです。あなたはこのループをスピードアップする必要がある場合は

for i, w_thing in zip(idx, w): 
    v[i] += w_thing 

のように、あなたが持つかもしれないあなたのコードは、再使用して名前wなしとインデックスの別のセットを導入することなく、もう少し明確であったかもしれないことを

注意サイモンはこれを比較的簡単にします。

+0

さらに単純です。idxのiの場合:v [i] + = w [i] '。 –

+1

または優れた 'scipy.weave.inline'。 – katrielalex

+0

インデックスがなければ、これはうまくいくはずですか? 投稿したコードは単純に '' v + w''ですか? ( '' v''が '' w''よりも長い場合、最初の '' len(w) ''要素だけが使用されます) '' w''を再利用するのはかなり悪い誤植です、 –

関連する問題