如何在numpy花式索引(索引列表中多个相同的索引)中进行逐元素运算符(substract)?

时间:2017-10-23 09:44:20

标签: python numpy

我的项目刚抓到一个错误,我想做以下事情:

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)

1 个答案:

答案 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方法,将-=替换为+=