2016-11-21 191 views
3

列我有兩個矩陣:乘兩個矩陣與蟒蛇

A = [a11 a12 

    a21 a22] 


B = [b11 b12 
    b21 b22] 

我要乘其所有列(無環),以獲得矩陣:

C =[a11*b11 a11*b12 a12*b11 a12*b12 
    a21*b21 a21*b22 a22*b21 a22*b22] 

我已經嘗試過

>>> C = np.prod(A,B,axis=0) 

但是prod不接受兩個輸入矩陣。 np.matrix.prod。

在此先感謝。

回答

7

我們可以使用broadcasting了量化的解決方案 -

(A[...,None]*B[:,None]).reshape(A.shape[0],-1) 

理念:在矢量/廣播語言方面,我會形容這是傳播或將輸入數組的第二維反對彼此,同時保持其第一維度對齊。這種擴展是通過爲這兩個輸入引入帶有None/np.newaxis的新軸然後簡單地相互相乘來完成的。

數學視圖:讓我們通過一個通用示例的幫助,使用更多的數學視圖。考慮輸入陣列具有不同的列數 -

In [504]: A = np.random.rand(2,3) 

In [505]: B = np.random.rand(2,4) 

首先,延伸的尺寸,並檢查它們的形狀 -

In [506]: A[...,None].shape 
Out[506]: (2, 3, 1) 

In [507]: B[:,None].shape 
Out[507]: (2, 1, 4) 

現在,執行元素方式乘法,這將在執行這些乘法廣播方式。採取在輸出的形狀細看 -

In [508]: (A[...,None]*B[:,None]).shape 
Out[508]: (2, 3, 4) 

所以,通過使用None/np.newaxis引入的單尺寸(長度= 1尺寸)將是沿其各自的陣列的元件將根據被廣播的那些之前倍增。這種引擎蓋下的廣播與相應的操作(在這種情況下是乘法)是以非常有效的方式完成的。

最後,我們將這個3D數組重新排列爲2D,保持與原始輸入相同的行數。

採樣運行:

In [494]: A 
Out[494]: 
array([[2, 3], 
     [4, 5]]) 

In [495]: B 
Out[495]: 
array([[12, 13], 
     [14, 15]]) 

In [496]: (A[...,None]*B[:,None]).reshape(A.shape[0],-1) 
Out[496]: 
array([[24, 26, 36, 39], 
     [56, 60, 70, 75]]) 

NumPy matrix類型爲輸入

對於NumPy matrix types作爲輸入,我們可以使用np.asmatrix會簡單地創建視圖到輸入。使用這些視圖,將執行廣播的逐元素乘法,最終導致重整後的2D陣列。所以,最後一步將轉換爲np.matrix類型。讓我們使用同一個樣品輸入演示實施 -

In [553]: A 
Out[553]: 
matrix([[2, 3], 
     [4, 5]]) 

In [554]: B 
Out[554]: 
matrix([[12, 13], 
     [14, 15]]) 

In [555]: arrA = np.asarray(A) 

In [556]: arrB = np.asarray(B) 

In [557]: np.asmatrix((arrA[...,None]*arrB[:,None]).reshape(A.shape[0],-1)) 
Out[557]: 
matrix([[24, 26, 36, 39], 
     [56, 60, 70, 75]]) 
+1

你能解釋索引在這裏的工作原理嗎? –

+0

好奇,但當用'np.matrix()'定義上述2D矩陣並應用廣播時 - 給出錯誤'ValueError:形狀太大而不能作爲矩陣。' – RomanPerekhrest

+0

@RomanPerekhrest嗯,我假定NumPy數組。也許我應該澄清一下。 – Divakar

1
b = np.tile(B, 2) # two copies of B, side by side 
a = np.tile(A, 2) 
a = np.hstack((a[:,::2], a[:,1::2])) # change 1,2,1,2 to 1,1,2,2 
a * b # done 

我希望有一個更好的方式做第三步,但上面的作品,是相對有效。