2015-11-26 64 views
2

我學習numpy的線性algerba,我想執行一個簡單的計算: 我:矩陣和向量之間的numpy廣播?

m = np.array([[1,2], 
       [3,4], 
       [5,6]] 
v = np.array([10,20,30]) 

我要計算什麼/輸出:

[ [1/10, 2/10], 
    [3/20, 4/20], 
    [5/30, 6/30]] 

主要執行元件 - 每行m和每個元素之間的明智劃分v我可以通過一些for循環來做到這一點,但我想知道「正確」的做法。

我感到它與廣播有關,但就是這樣。

謝謝。

+0

感謝它正是我想要的 – newway

回答

0

您需要將v的元素與第一個軸m對齊。一種方法是將v擴展爲具有np.newaxis/None的2D陣列,然後broadcasting在執行元素劃分時發揮作用。另外,由於兩個輸入都是整數數組,並且您正在執行除法,所以在執行元素除法之前,需要將其中一個轉換爲浮點數。因此,最終的實現將是 -

m/v[:,None].astype(float) 

可避免在用戶級轉化爲浮點陣列如果使用NumPy的真正的分裂FUNC np.true_divide發動機罩下負責浮點轉換。因此,它的實施將是 -

np.true_divide(m,v[:,None]) 

採樣運行 -

In [203]: m 
Out[203]: 
array([[1, 2], 
     [3, 4], 
     [5, 6]]) 

In [204]: v 
Out[204]: array([10, 20, 30]) 

In [205]: m/v[:,None].astype(float) 
Out[205]: 
array([[ 0.1  , 0.2  ], 
     [ 0.15  , 0.2  ], 
     [ 0.16666667, 0.2  ]]) 

In [206]: np.true_divide(m,v[:,None]) 
Out[206]: 
array([[ 0.1  , 0.2  ], 
     [ 0.15  , 0.2  ], 
     [ 0.16666667, 0.2  ]])