【问题标题】:Subtract a column vector from matrix at specified vector of columns using only broadcast仅使用广播从指定列向量的矩阵中减去列向量
【发布时间】:2019-04-17 02:32:22
【问题描述】:

我想使用另一个向量从 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次,所以从第三列即M-4次的最后一列中减去V。

我只需要使用广播来做到这一点,没有循环。

我尝试了以下方法:

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

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

【问题讨论】:

    标签: python numpy matrix array-broadcasting


    【解决方案1】:

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

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

    【讨论】:

    • 扩展 I 似乎没有必要——为简洁起见仍然 +1
    【解决方案2】:

    可以使用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]])
    

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

    【讨论】:

      猜你喜欢
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2021-01-01
      • 2013-12-02
      相关资源
      最近更新 更多