我們可以使用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]])
你能解釋索引在這裏的工作原理嗎? –
好奇,但當用'np.matrix()'定義上述2D矩陣並應用廣播時 - 給出錯誤'ValueError:形狀太大而不能作爲矩陣。' – RomanPerekhrest
@RomanPerekhrest嗯,我假定NumPy數組。也許我應該澄清一下。 – Divakar