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

2023-12-01

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

运算结束时,由于 I 中出现 4 次 3,因此将减去 Vthird列,即 M- 4 次的最后一列。

我需要仅使用广播而不是循环来执行此操作。

我已经尝试过以下方法:

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

但它最终会广播结果矩阵,使其具有比 M 中更多的列。


一个可以用bincount and 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]])

or 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]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐