2015-12-03 144 views
3

我试图高效地更新numpy数组A的某些元素,使用另一个数组b来指示要更新的A元素的索引。但是,b可以包含被忽略的重复项,但我希望将其考虑在内。我想避免循环b。为了说明它:使用数组作为索引增加numpy数组元素

>>> A = np.arange(10).reshape(2,5) 
>>> A[0, np.array([1,1,1,2])] += 1 
>>> A 
array([[0, 2, 3, 3, 4], 
     [5, 6, 7, 8, 9]]) 

,而我想的输出是:

array([[0, 3, 3, 3, 4], 
     [5, 6, 7, 8, 9]]) 

任何想法?

+0

索引中的阵列,列指数1时的3倍。如果您希望元素的数量与索引发生的次数相同,则元素[0,1]应该变成1 + 3 = 4. –

回答

4

要正确处理重复索引,您需要使用np.add.at而不是+=。因此,更新的A第一行,最简单的方法很可能是做到以下几点:

>>> np.add.at(A[0], [1,1,1,2], 1) 
>>> A 
array([[0, 4, 3, 3, 4], 
     [5, 6, 7, 8, 9]]) 

ufunc.at方法的文件可以发现here

+0

谢谢。它按预期工作。谢谢你的指针,我不知道这个功能,这是非常有用的。 – geompalik

0

一种方法是使用numpy.histogram找出有多少个值均为指数,然后将结果添加到A

A[0, :] += np.histogram(np.array([1,1,1,2]), bins=np.arange(A.shape[1]+1))[0] 
+0

感谢您的回答,但我认为接受的更直观。 – geompalik