也许以前有人问过,但我找不到。有时我有一个索引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].
有没有办法以向量化的方式做我想做的事而没有循环?如果没有,那是最快的方法?
用途numpy.add.at:
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:
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解决方案中转换类型。
add.at
bincount
如果OTOHA并B为floatD类,然后bincount会更快。
A
B
float