numpy通过向量减去矩阵的每一行

时间:2014-10-13 04:43:37

标签: python numpy matrix

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

我目前有一个 for 循环,它会迭代并通过向量减去矩阵中的 i 行。 有没有办法简单地用向量减去整个矩阵?

谢谢!

当前代码:

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

X1 是矩阵的 i 行, X2 是向量。我可以这样做,以便我不需要 for 循环吗?

3 个答案:

答案 0 :(得分:50)

只有在尾随轴具有相同尺寸时,才能在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

答案 1 :(得分:10)

除了@ 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]])

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

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

答案 2 :(得分:0)

如果您只是创建要减去的向量,则也可以使用

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

获取列向量,仅当其维数为2或更大时才可以。
一维numpy数组始终是行,不能转置!

那你就可以做

each_column_of_matrix_minus_vector = matrix - column_vector

column_vector的每一列中减去matrix