我有一个数组:
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中实现它?
答案 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