2014-10-13 68 views
28

减去矩阵中的每一行所以我有一个n x d矩阵和n x 1载体。我正在尝试编写一个代码,用矢量减去矩阵中的每一行。NumPy的通过矢量

我现在有一个for循环迭代访问通过和由向量中减去在基质中i -th行。 有没有简单的方法来减去矢量的整个矩阵?

谢谢!

当前代码:

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

这是X1是矩阵的i行和第X2是矢量。我可以做到这一点,我不需要for循环?

回答

39

只适用于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进行说明。

+0

如何在第二种情况下'mv.transpose()'? –

8

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