2011-04-25 68 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做到这一点,但我猜它只会使代码更可读,没有任何合理的性能改进。