2011-08-02 21 views
4

配列のインデックス付けに問題があります。 b要素が指し示す位置にある値を代入するために、配列aとbのインデックスとして使う別の配列bがあるとします。私は冗長要素を持つPython配列を使用したPython配列のインデックス

[ 0. 2. 0. 0. 0.] 

配列bには何の冗長性(すべての値を持っていない場合は何も問題はありませんが期待しながら、

a=numpy.zeros(5) 
print a 

[ 0. 0. 0. 0. 0.] 

今、私は二回

b=numpy.array([1,1]) 
a[b]+=1. 
print a 

[ 0. 1. 0. 0. 0.] 

第二の要素を増やしたいですその要素の異なる)。 誰かがforループの使用を避けるような問題の解決策を得ましたか?それはnumpyのバグですか? ありがとうございます

答えて

7

別の配列のインデックスに整数配列を使用すると、結果の配列がストライドで表現できないため、NumPyで適切なビューを作成できません。

>>> a = np.zeros(5) 
>>> b = np.array([1, 1]) 
>>> c = a[b] 
>>> c 
array([ 0., 0.]) 
>>> c.base is a 
False 

+=のようなインプレース操作でこのインデックスを使用して、numpyのは違っあなたが期待するよりも、それを解釈します。したがって、それはコピーを返します。 「インデックス配列を移動して各要素を順番に実行する」のではなく、最初にb(この場合はインデックス1の要素が1つ)のすべての値を選択し、これらの要素に対して操作を実行します一度

+0

明確な答えをありがとう。あなたの意見では、この問題に巧みなやり方がありますか(つまり、配列や辞書を使用している可能性があります)?私は非常に大きな配列で作業しているので、ループを避けるために何かを試してみます... – fightthewar

+1

ループを試しましたか?それは同じくらい速いかもしれない*。 –

1

あなたは試すことができます:

a += numpy.histogram(b, numpy.arange(len(a)+1))[0] 

をこれがa = array([ 0., 2., 0., 0., 0.])

2

か、bincountを(使用することができます)を返します:

a=numpy.zeros(5) 
idx = numpy.bincount([0,0,0,1,1,3,3]) 
a[:len(idx)]+=idx 
関連する問題