使用数组作为索引增加numpy数组元素

6

我正在尝试使用另一个数组b来指示要更新的A数组的元素的索引,以高效地更新numpy数组A的某些元素。然而,b可以包含被忽略的重复项,而我希望它们被考虑在内。我想避免对b进行循环。为了说明这一点:

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

有任何想法吗?


在您的索引数组中,列索引1出现了3次。如果您希望元素被递增与索引出现的次数相同,那么元素[0,1]应该变为1 + 3 = 4。 - Seppo Enarvi
2个回答

11

为了正确处理重复索引,您需要使用 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方法的文档可以在此处找到。


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

0
一种方法是使用numpy.histogram来查找每个索引处有多少个值,然后将结果添加到A中:
A[0, :] += np.histogram(np.array([1,1,1,2]), bins=np.arange(A.shape[1]+1))[0]

谢谢你的回答,但我认为被采纳的那个更直观。 - geompalik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接