2017-03-15 131 views
0

我有兩個numpy的陣列a和b。減去元件來排陣列在python

a=np.array([[1,2,3],[4,5,6],[7,8,9]]) 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

b = np.array([1,2,3]) 
array([1, 2, 3]) 

我想。減去至b的對應的元件的每一行(即到的第一行, b)的第一個元素等 讓c是

array([[0, 1, 2], 
     [2, 3, 4], 
     [4, 5, 6]]) 

有一個python命令來做到這一點?

+0

您的問題完全通過標記爲重複的前兩個回答來回答。 – asongtoruin

回答

0

yup!你只需要使得B的列向量第一

a - b[:, np.newaxis] 
1

有一個python命令來做到這一點?

是的,-運營商。

此外,你需要做b成列向量,使廣播能爲你做的其餘部分:

a - b[:, np.newaxis] 

# array([[0, 1, 2], 
#  [2, 3, 4], 
#  [4, 5, 6]]) 
0

重塑b成列向量,然後減去:

a - b.reshape(3, 1) 

b沒有改變,但方法調用的結果將是列向量:

array([[1], 
     [2], 
     [3]]) 

允許您想要的減法的「形狀」。有一點更一般的重塑操作將是:

b.reshape(b.size, 1) 

b以具有然而,許多元件,並且它們成型爲一個N×1個向量。

更新:快速基準測試顯示kazemakase's answer,使用b[:, np.newaxis]作爲重塑策略,快7%。對於小向量,這些μs的少量額外分數無關緊要。但對於大型矢量或內部循環,更喜歡他的方法。這是一個不太普遍的重塑,但更適合這種用途。

+0

一般整形的小補充:'b.reshape(-1,1)'可以讓reshape自動設置一個尺寸的大小,而不顯式查詢'b.shape'。 – kazemakase

+0

@kazemakase好點。不確定OP是否準備好採用'-1'通配符,但是自從您提出這個通配符之後,它就會調整性能而不失一般性。豎起大拇指。 –