Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy用向量减去矩阵的每一行_Python_Numpy_Matrix - Fatal编程技术网

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

Python numpy用向量减去矩阵的每一行,python,numpy,matrix,Python,Numpy,Matrix,所以我有一个nxd矩阵和一个nx1向量。我想写一个代码,用向量减去矩阵中的每一行 我目前有一个for循环,循环遍历并用向量减去矩阵中的第行有没有办法简单地用向量减去整个矩阵? 谢谢 当前代码: for i in xrange( len( X1 ) ): X[i,:] = X1[i,:] - X2 在这里,X1是矩阵的i第四行,X2是向量。我可以这样做吗?循环不需要?在numpy中工作,但仅当后轴具有相同的尺寸时。以下是成功从矩阵中减去向量的示例: In [27]: print m; m

所以我有一个
nxd
矩阵和一个
nx1
向量。我想写一个代码,用向量减去矩阵中的每一行

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

谢谢

当前代码:

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

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

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

对广播轴的规则进行了深入解释。

除了@John1024 answer外,还可以如下方式在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]])

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

column_vector = np.array([0,1,2], ndmin=2).T
获取列向量,仅当其维度为2或2以上时才有可能获取。
一维numpy数组始终是行,无法转置

那你就做吧

each_column_of_matrix_minus_vector = matrix - column_vector

矩阵
的每一列中减去
列向量

m-v.transpose()
通常不会起到相同的作用。@MadPhysician问题是numpy中的一维数组不能被转置,因为它将与输出相同。您必须向它添加一个维度,以便像在长崎45的答案中或在使用ndmin=2参数创建np.array时那样对其进行转置。@xuiqy。很好。我将删除该评论。转置通常复制内存。更好的方法可能是
m-v[:,None]
FYI,如果你忘记了np.newaxis的东西,m-v[:,None]也可以。“我认为这个选择更简单。”克里斯蒂亚诺·赖利说
np.newaxis为无
。它们指的是同一个对象。在这一点上,作者认为它更清晰。