作者: Minkyung Kang
譯者:知道來源並尋找流。
原文鏈結:
在上面,我提到不推薦使用 np.DOT 對高維陣列進行操作。 這是什麼意思?
在 stackoverflow 中,有乙個有趣的問題(np.dot 和 @ 之間的區別。 讓我們來看看這個。
# define input arrays
a = np.random.rand(3,2,2) # 2 rows, 2 columns, in 3 layers
b = np.random.rand(3,2,2) # 2 rows, 2 columns, in 3 layers
# perform matrix multiplication
c = np.dot(a, b)
d = a @ b # python 3.5+
c.shape # np.dot
d.shape #
對於相同的輸入,有完全不同的輸出,這怎麼可能? 這是由於對 np 的支援dot 和 @. 看看 stackoverflow 上最受歡迎的答案(也許可以觸及我們的疑問。
從文件中可以看出,matmul 與 dot 在兩個重要方面有所不同:此外,numpy 的官方文件(其中也有更多詳細資訊。1.matmul 不允許標量乘法。
2.Matmul 將矩陣堆疊在一起進行廣播,就好像矩陣是元素一樣。 (stacks of matrices are broadcast together as if the matrices were elements.)
最後一點清楚地表明,在處理 3-D 或更高階別的陣列時,dot 和 matmul 方法的行為是不同的。 讓我們從下面的文件中獲取更多資訊。
對於 matmul 函式:如果任何引數是 n-d 陣列 (n>2),則將它們視為駐留在最後兩個索引中的矩陣堆疊並相應地廣播。 (if either argument is n-d, n > 2, it is treated as a stack of matrices residing in the last two indexes and broadcast accordingly.)
對於NP點函式:對於二維陣列,它相當於矩陣乘法; 對於一維陣列,它等價於向量的內積(不包括復共軛)。 對於 n 維陣列,它是 a 的最後乙個軸和 b 的倒數第二個軸上元素的乘積之和。 (for 2-d arrays it is equivalent to matrix multiplication, and for 1-d arrays to inner product of vectors (without complex conjugation). for n dimensions it is a sum product over the last axis of a and the second-to-last of b.)
如果 a 是 n-d 陣列,b 是 m-d 陣列(其中 m>>=2),則它是 a 的最後乙個軸和 b 的倒數第二個軸的總和積:因此,簡而言之,在矩陣乘法的正常情況下,如果我們想處理最後兩個索引中的每個矩陣堆疊,我們應該使用 matmul。dot(a, b)[i,j,k,m] = sum(a[i,j,:]b[k,:,m])
np.multiply != np.dot != np.matmul == @
和 NP乘法需要 np求和來執行點積。 不建議用於點積或矩陣乘法。
np.DOT適用於點積和矩陣乘法。 但是,由於其名稱,建議避免將其用於矩陣乘法。
np.matmul 和 @ 是一回事,旨在執行矩陣乘法。 @被新增到python 35+ 為矩陣乘法提供自己的中綴。
np.DOT 和 NPMatmul 的行為大致相似,但有兩個例外:1) Matmul 不允許使用標量乘法,以及 2) 它對 n>2 維的計算方式不同。您可以檢視文件以決定使用哪個函式。
一句話概述:
對於點積運算,使用 np.dot。對於矩陣乘法,對於 python 3@ 用於版本 5 或更高版本,np. 用於早期 Python 版本matmul。
numpy matrix multiplication — np.matmul() and @(
numpy.dot official document(
pep 465 – a dedicated infix operator for matrix multiplication(
difference between numpy dot() and python 3.5+ matrix multiplication @(
我是一名技術創作者
收集知識來滋養你和我。