我的项目刚抓到一个错误,我想做以下事情:
import numpy as np
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
a[[0,1,1]] -= b[[0,1,2]]
我希望结果第二个a[1] = a[1]-b[1]-b[2] = -11
,因为[xxx]中有两个index = 1,因此我希望减去[1]两次。但这个numpy代码只产生:
array([-4, -4, -5])
因为我想numpy提高我的算法速度,因此我只想写vectorize numpy代码(避免python for-loop)
答案 0 :(得分:1)
方法#1
您需要使用np.subtract.at
对给定值的累加减法进行给定值 -
np.subtract.at(a,[0,1,1], b[[0,1,2]])
示例运行 -
In [8]: a = np.array([1,2,3,4])
In [9]: b = np.array([5,6,7,8])
In [10]: np.subtract.at(a,[0,1,1], b[[0,1,2]])
In [11]: a
Out[11]: array([ -4, -11, 3, 4])
方法#2
或者,使用np.bincount
-
ind = np.array([0,1,1])
val = b[[0,1,2]]
unq_ind = np.unique(ind)
a[unq_ind] -= np.bincount(ind, val).astype(a.dtype)
如果ind
已经排序,请unq_ind
,如此 -
unq_ind = ind[np.concatenate(([True],ind[1:] != ind[:-1]))]
方法#2S (更简单)
如果您不想处理unique
工作,请使用minlength
arg与bincount
-
a -= np.bincount([0,1,1], b[[0,1,2]], minlength=a.size).astype(a.dtype)
累计添加
要使用建议的方法进行添加而不是减去,只需将np.subtract.at
替换为np.add.at
,对于bincount
方法,将-=
替换为+=
。