2011-04-25 99 views
4

在numpy中矢量化下面的代碼的最佳方式是什麼?矢量化numpy中的索引操作

from numpy import * 

A = zeros(5, dtype='int') 
I = [1, 1, 1, 3] 
J = [2, 1, 1, 1] 
for i, j in zip(I, J): 
    A[i] += j 

print A 

結果應該是:

[0 4 0 1 0] 

這裏A是原來的數組,I在商店,我們希望通過J相應條目遞增索引。

如果一個簡單的向量化上面做:

A[I] += J 
print A 

一個得到錯誤的答案

[0 1 0 1 0] 

爲,顯然,指數反覆被忽略。是否有與+=等效的操作,它不會忽略重複的索引?

回答

3

您可以使用numpy.bincount()

A = numpy.zeros(5, dtype='int') 
I = [1, 1, 1, 3] 
J = [2, 1, 1, 1] 
sums = numpy.bincount(I, J) 
A[:len(sums)] += sums 
print(A) 

打印

[0 4 0 1 0] 
2

原則上可以用numpybincountunique做到這一點,但我猜它只會使代碼更可讀,沒有任何合理的性能改進。