仅使用广播从指定列向量处的矩阵中减去列向量

时间:2018-11-14 07:14:45

标签: python numpy matrix numpy-broadcasting

我想使用另一个向量从numpy矩阵中减去列向量,该向量是需要从主矩阵中减去第一个列向量的列的索引。例如。

M = array([[  1,   2,   1,   1],
           [  2,   1,   1,   1],
           [  1,   1,   2,   1],
           [  2,   1,   1,   1],
           [  1,   1,   1,   2]])  # An example matrix

V = array([1, 1, 1, 1, 1]) # An example column vector

I = array([0, 3, 2, 3, 1, 3, 3]) # The index maxtrix

现在我想在I中给定的列号上从M中减去V。 例如。 I [0]为0,因此从矩阵M的第一列(零索引)中减去V。

类似地,I [1] = 3,从矩阵M的第四列(三个索引)中减去V。

操作结束时,由于3在I中出现4次,因此将从第三列中减去V,即M-4的最后一列。

我只需要广播,不循环就可以做到这一点。

我尝试了以下方法:

M[:, I] - V[np.newaxis, :].T

但是它最终广播的结果矩阵要比M中的列多。

2 个答案:

答案 0 :(得分:4)

一个人可以使用bincountouter

>>> M - np.outer(V, np.bincount(I, None, M.shape[1]))
array([[ 0,  1,  0, -3],
       [ 1,  0,  0, -3],
       [ 0,  0,  1, -3],
       [ 1,  0,  0, -3],
       [ 0,  0,  0, -2]])

subtract.at

>>> out = M.copy()
>>> np.subtract.at(out, (np.s_[:], I), V[:, None])
>>> out
array([[ 0,  1,  0, -3],
       [ 1,  0,  0, -3],
       [ 0,  0,  1, -3],
       [ 1,  0,  0, -3],
       [ 0,  0,  0, -2]])

答案 1 :(得分:3)

我们可以在M的转置视图上使用np.subtract.at-

np.subtract.at(M.T,I,V)