2014-10-13 96 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]])