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

Python 仅使用广播从指定列向量处的矩阵中减去列向量,python,numpy,matrix,array-broadcasting,Python,Numpy,Matrix,Array 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 = arra

我想用另一个向量从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中的多。

我们可以在
M
-

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

可以使用
bincount
outer

>>> 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]])

>>> 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]])

扩展
I
似乎没有必要-为了简洁起见,仍然是+1