numpy.array.__iadd__ 与重复索引

13 投票
2 回答
2401 浏览
提问于 2025-04-18 08:58

我有一个数组:

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

还有一个包含重复索引的列表:

idx = [0, 0, 1, 1, 2, 2]

我还有另一个数组,想用上面的索引把它加到数组A里:

B = np.array([1, 1, 1, 1, 1, 1])

这个操作:

A[idx] += B

得到了结果:array([1, 1, 1]),所以很明显,数组B的值没有被加起来。那么,怎样才能得到结果array([2, 2, 2])呢?我需要一个一个地遍历这些索引吗?

2 个回答

1

这样怎么样:

A = np.array([1, 2, 3])
idx = [0, 0, 1, 1, 2, 2]
A += np.bincount(idx, minlength=len(A))

显然,如果A一开始就是零,那就更简单了:

A = np.bincount(idx)
30

在numpy 1.8版本中,新增了一个叫做at的功能:

at(a, indices, b=None)

这个功能可以直接在操作数'a'上进行不使用缓冲区的操作,针对的是由'indices'指定的元素。对于加法操作,这个方法和a[indices] += b是一样的,唯一的不同是如果某些元素被多次索引,结果会累加。例如,a[[0,0]] += 1只会让第一个元素增加一次,因为它使用了缓冲,而add.at(a, [0,0], 1)会让第一个元素增加两次。

.. 这个功能是在1.8.0版本中新增的。

In [1]: A = np.array([0, 0, 0])
In [2]: B = np.array([1, 1, 1, 1, 1, 1])
In [3]: idx = [0, 0, 1, 1, 2, 2]
In [4]: np.add.at(A, idx, B)
In [5]: A
Out[5]: array([2, 2, 2])

撰写回答