所以我有 n x d
矩阵和 n x 1
向量。我正在尝试编写一个代码来通过向量减去矩阵中的每一行。
我目前有一个 for
循环,它会迭代并通过向量减去矩阵中的 i
行。 有没有办法简单地用向量减去整个矩阵?
谢谢!
当前代码:
for i in xrange( len( X1 ) ):
X[i,:] = X1[i,:] - X2
X1
是矩阵的 i
行, X2
是向量。我可以这样做,以便我不需要 for
循环吗?
答案 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
。