2017-02-01 11 views
2

簡易版を複数の値を追加します。 を私はこれを行う場合:1 numpyの配列インデックスに

import numpy as np 
a = np.zeros(2) 
a[[1, 1]] += np.array([1, 1]) 

は、私は出力として[0, 1]を取得します。でも、私は[0, 2]が好きです。それはどういうわけか、自分でループするのではなく暗黙的なnumpyループを使って可能ですか?私は、インデックス、値、およびいくつかのブール値が含まれている構造化された配列を持っている

:何-I-実際に必要なツー行うバージョン

。私はブール値に基づいてそれらのインデックスでそれらの値を合計したいと思います。明らかにこれは単純なループで行うことができますが、賢明なnumpyインデックス付け(上記のように)で可能であるように思われます。私は何が起こっているかと思います

[ 0.   0.   0.61927097 0.02592623 0.29965467] 
[ 0.   0.   1.05459336 0.02592623 1.27063303] 

import numpy as np 
size = 5 
nvalues = 10 
np.random.seed(1) 
a = np.zeros(nvalues, dtype=[('val', float), ('ix', int), ('cond', bool)]) 
a = np.rec.array(a) 
a.val = np.random.rand(nvalues) 
a.cond = (np.random.rand(nvalues) > 0.3) 
a.ix = np.random.randint(size, size=nvalues) 

# obvious solution 
obvssum = np.zeros(size) 
for i in a: 
    if i.cond: 
     obvssum[i.ix] += i.val 

# is something this possible? 
doesntwork = np.zeros(size) 
doesntwork[a[a.cond].ix] += a[a.cond].val 

print(doesntwork) 
print(obvssum) 

が出力:

例えば、私は値、インデックス、および条件で、配列から移入したい5つの要素を持つ配列を持っていますここではa[a.cond].ixが一意であることが保証されていれば、私のメソッドは簡単な例で述べたようにうまくいくでしょう。

答えて

5

これはnumpyののufuncsのat方法が何のためにあるのかです:

output = numpy.zeros(size) 
numpy.add.at(output, a[a.cond].ix, a[a.cond].val) 
関連する問題