[英]Why is the matrix @ product of two numpy (n,) vectors the dot product, rather than the outer product?
如果我有 x.shape = (n,) 和 y.shape = (n,),則 x @ y 返回它們的點積,而不是它們的外積。 我想知道這是否有一些潛在的原因,或者是否只是為了方便。
謝謝。
Function np.matmul
是在將@
運算符引入 Python 時添加的。 新的 function 被設計為與np.dot
相似,合理。
那么為什么np.dot(vector, vector)
執行內積呢?
在@
之前,function np.dot
用於在 numpy 中執行矩陣代數。 實際上,線性代數中的向量不是一維 arrays 而是其中一個維度設置為 1 的矩陣。為了將一維數組乘以矩陣,必須以某種方式將前者提升為行向量或列向量。 我們這里有3個案例:
作為最后一種情況的結果,我們在兩個向量之間有一個正常的內積。 這個策略既合乎邏輯又實用,因為內積的使用頻率更高。
dot product
的維基文章將其定義為
在代數上,點積是兩個數字序列的相應條目的乘積之和。
(它多次提到inner product
,但沒有提到outer
產品。)
如果您將 1d arrays 視為數字序列,那么A@B
作為點積是自然的。
二維矩陣積可以描述為 A 的所有行與 B 的列的dot product
。
matmul
和dot
中的關鍵術語是“產品的總和”。
對於一維數組, np.sum(A*B)
是乘積和的另一個表達式,其中*
是元素乘法。
帶有 (1,n) 的 (m,1) @ 確實會產生 (m,n) 外積,但這實際上是在共享大小 1 維度上減少的二維矩陣積。
我們不需要“積和”機制來做兩個一維 arrays 的outer
積:
In [29]: np.array([1,2,3])[:,None] * np.array([10,100])
Out[29]:
array([[ 10, 100],
[ 20, 200],
[ 30, 300]])
In [30]: np.array([1,2,3])[:,None] @ np.array([10,100])[None,:]
Out[30]:
array([[ 10, 100],
[ 20, 200],
[ 30, 300]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.