numpy用向量减去矩阵的每一行

Posted

技术标签:

【中文标题】numpy用向量减去矩阵的每一行【英文标题】:numpy subtract every row of matrix by vector 【发布时间】:2014-12-07 14:32:13 【问题描述】:

所以我有一个 n x d 矩阵和一个 n x 1 向量。我正在尝试编写一个代码来用向量减去矩阵中的每一行。

我目前有一个 for 循环,该循环遍历矩阵中的第 i 行并将向量减去。 有没有办法简单地用向量减去整个矩阵?

谢谢!

当前代码:

for i in xrange( len( X1 ) ):
    X[i,:] = X1[i,:] - X2

这里 X1 是矩阵的第 i 行,而 X2 是向量。我可以做到这样我就不需要 for 循环了吗?

【问题讨论】:

【参考方案1】:

这在numpy 中有效,但仅当尾轴具有相同尺寸时。下面是一个成功从矩阵中减去向量的例子:

In [27]: print m; m.shape
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
Out[27]: (4, 3)

In [28]: print v; v.shape
[0 1 2]
Out[28]: (3,)

In [29]: m  - v
Out[29]: 
array([[0, 0, 0],
       [3, 3, 3],
       [6, 6, 6],
       [9, 9, 9]])

这很有效,因为两者的尾轴具有相同的尺寸 (3)。

在您的情况下,引导轴具有相同的尺寸。下面是一个示例,使用与上述相同的 v,说明如何解决该问题:

In [35]: print m; m.shape
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
Out[35]: (3, 4)

In [36]: (m.transpose() - v).transpose()
Out[36]: 
array([[0, 1, 2, 3],
       [3, 4, 5, 6],
       [6, 7, 8, 9]])

广播轴的规则深入讲解here。

【讨论】:

m-v.transpose() 通常不会这样工作。 @MadPhysicist 问题是 numpy 中的一维数组无法转置,因为它将与输出相同。您必须向它添加一个维度来转置它,就像在 Nagasaki45 的答案中或在使用 ndmin=2 参数创建 np.array 时一样。 @xuiqzy。很好的一点。我会删除评论。移调通常会复制内存。更好的方法可能是m - v[:, None]【参考方案2】:

除了@John1024 的回答,在 numpy 中“转置”一维向量可以这样完成:

In [1]: v = np.arange(3)

In [2]: v
Out[2]: array([0, 1, 2])

In [3]: v = v[:, np.newaxis]

In [4]: v
Out[4]:
array([[0],
       [1],
       [2]])

从这里开始,使用广播从m 的每一列中减去v 是微不足道的:

In [5]: print(m)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

In [6]: m - v
Out[6]:
array([[0, 1, 2, 3],
       [3, 4, 5, 6],
       [6, 7, 8, 9]])

【讨论】:

仅供参考,如果您忘记了 np.newaxis 的事情,m-v[:, None] 也可以工作。我认为这个选项更简单。 @ChristianO'Reilly。 np.newaxis is None。它们指的是同一个对象。在这一点上,作者认为它更清晰。【参考方案3】:

如果你只是创建被减去的向量,你也可以使用

column_vector = np.array([0,1,2], ndmin=2).T

得到一个列向量,只有当它的维度为 2 或更多时才有可能。 一维numpy数组总是行,不能转置!

那你就可以了

each_column_of_matrix_minus_vector = matrix - column_vector

matrix 的每一列中减去column_vector

【讨论】:

以上是关于numpy用向量减去矩阵的每一行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用numpy将矩阵与另一个矩阵中的每一行相乘

怎样用matlab实现:一个列向量与矩阵的每一列做点乘?

我可以在 matlab 矩阵的每一行和没有循环的向量之间找到共同值吗?

如何将矩阵的每一行除以R中的向量元素

将密集向量与 Tensorflow 中稀疏矩阵的每一行相乘

armadillo c++:将矩阵的每一行乘以向量的有效而简洁的方法?