2016-06-25 113 views
5

我有一个数组:如何通过索引在numpy中累积数组?

a = np.array([0,0,0,0,0,0]) 

我要添加一些其它数组的每个索引,而索引可以出现多于一个次。我想获得每个索引的一些。我写:

a[np.array([1,2,2,1,3])] += np.array([1,1,1,1,1]) 

却得到了一个为:

array([0, 1, 1, 1, 0, 0]) 

但我要的是得到:

array([0, 2, 2, 1, 0, 0]) 

如何实现这numpy的没有for循环?

回答

9

使用纯numpy,以及避免for循环:

np.add.at(a, np.array([1,2,2,1,3]), np.array([1,1,1,1,1])) 

输出:

>>> a = np.array([0,0,0,0,0,0]) 
>>> np.add.at(a, np.array([1,2,2,1,3]), np.array([1,1,1,1,1])) 
>>> a 
array([0, 2, 2, 1, 0, 0]) 

请注意,这确实就地替换。这是你所期望的,但未来的观众可能不希望这样做。因此,笔记:)

+1

太棒了。我甚至看过'np.add.reduceat',但我没有花太多时间用'ufunc'方法,所以我不了解它们中的大部分。这里的[documentation](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.at.html)甚至是完美的......“对于另外的ufunc,这种方法相当于[索引] + = b,除了对索引超过一次的元素累计结果“ – mgilson

+1

谢谢,这正是我想要的。 – maple

1

你总是可以迭代自己。喜欢的东西:

for i in [1,2,2,1,3]: 
    a[i] += 1 
+1

谢谢,但我想避免循环。 – maple

1

我不知道的一个聪明的numpy的量化的方式来做到这一点...最好我能想出是:

>>> indices = np.array([1,2,2,1,3]) 
>>> values = np.array([1,1,1,1,1]) 
>>> a = np.array([0,0,0,0,0,0]) 
>>> for i, ix in enumerate(indices): 
... a[ix] += values[i] 
... 
>>> a 
array([0, 2, 2, 1, 0, 0]) 
+0

谢谢,但我想避免循环。 – maple

+2

@maple - 我明白,但我不知道有办法做到这一点。当然,这并不是说没有办法做到这一点(尽管可能没有)。无论如何,有时候有一个正确的(工作)代码的例子足以说明问题,让其他人能够更好地解决问题。 – mgilson

+0

@maple检查我的答案,如果你想知道一种方法来做到这一点。谢谢。尽管我完全赞同以不同方式解决问题的例子。 – oxalorg

1

你可以这样做(假设每个索引有一个相关值):

a = np.array([0,0,0,0,0,0]) 
idxs = np.array([1,2,2,1,3]) 
vals = np.array([1,1,1,1,1]) 
for idx, val in zip(idxs,vals): 
    a[idx] += val