小编典典

依次在numpy数组中添加值,而无需循环

python

也许以前有人问过,但我找不到。有时我有一个索引I,我想从另一个数组开始依次将该索引相应地添加到numpy数组中。例如:

A = np.array([1,2,3])
B = np.array([10,20,30])
I = np.array([0,1,1])
for i in range(len(I)):
    A[I[i]] += B[i]
print(A)

打印期望的(正确的)值:

[11 52  3]

A[I] += B
print(A)

导致预期的(错误的)答案

[11 32  3].

有没有办法以向量化的方式做我想做的事而没有循环?如果没有,那是最快的方法?


阅读 223

收藏
2021-01-16

共1个答案

小编典典

用途numpy.add.at

>>> import numpy as np
>>> A = np.array([1,2,3])
>>> B = np.array([10,20,30])
>>> I = np.array([0,1,1])
>>> 
>>> np.add.at(A, I, B)
>>> A
array([11, 52,  3])

或者,np.bincount

>>> A = np.array([1,2,3])
>>> B = np.array([10,20,30])
>>> I = np.array([0,1,1])
>>> 
>>> A += np.bincount(I, B, minlength=A.size).astype(int)
>>> A
array([11, 52,  3])

哪个更快?

依靠。在这个具体示例中,add.at速度似乎稍快一些,大概是因为我们需要在bincount解决方案中转换类型。

如果OTOHABfloatD类,然后bincount会更快。

2021-01-16