如何在numpy中通过索引累积数组?

时间:2016-06-25 04:49:44

标签: python arrays numpy vectorization

我有一个数组:

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

我想在a的每个索引中添加一些其他数组,而索引可以出现多次。我想得到每个索引的一部分。我写道:

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])

如何在没有for循环的情况下在numpy中实现它?

4 个答案:

答案 0 :(得分:11)

使用纯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 :(得分:1)

你总是可以自己迭代。类似的东西:

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

答案 2 :(得分: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])

答案 3 :(得分: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