2013-10-23 144 views
4

我怎樣才能變換形式如何將矩陣的標量矩陣與矢量矩陣進行元素乘法運算?

[[1,2] 
[3,4]] 

以下numpy的數組A到窗體的乙

[[[1,1,1],[2,2,2]] 
[[3,3,3],[4,4,4]]] 

使得我可以做逐元素乘法以C

[[[ 5, 6, 7],[ 8, 9,10]] 
[[11,12,13],[13,15,16]]] 

原始問題是將一個標量乘以一個向量,例如, 4 * [13,15,16]。但是我不是一個標量,而是一個標量矩陣(A),而不是一個向量,我有一個向量矩陣(C)。如果有一種方法沒有真正複製B中的值,我寧願這樣做(我猜,明顯的for循環會太慢)。

+2

嗯,我想我剛剛得到它:'A [:,:,] * C'但我不完全明白這裏發生了什麼。 – letmaik

+3

你也可以做'A [...,None] * C',它可以適用於任何維度,不僅適用於兩個維度。 – Jaime

+2

@neo,這裏發生的是你已經發現[廣播](http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html):) – askewchan

回答

3

你已經提到在評論答案:

A[:,:,None] * C 

之所以這工作是因爲numpy的解釋一個None片稱爲newaxis。從the docs

選擇元組中的每個newaxis對象用於將結果選擇的維度擴展一個單位長度維度。添加的維度是選擇元組中newaxis對象的位置。

所以這片相當於這樣做:

A.reshape(len(A), -1, 1)*C 

而且因爲我認爲這些都是numpy的array S,乘法默認情況下是當然的elementwise的。

+0

在[廣播]更多信息( http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html) – askewchan

+1

'reshape'不會修改'A',所以最後的例子仍然會導致廣播錯誤。也許你的意思是:'A.reshape(len(A),-1,1)* C',它給出了等價的結果。 – askewchan

+0

啊,你是對的。當我這樣做時,我甚至已經開放了REPL。 = X固定。 –