簡體   English   中英

為什么兩個 numpy (n,) 向量的矩陣@乘積是點積,而不是外積?

[英]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個案例:

  • 逐個矩陣的向量,一維數組被提升為行向量(1xN)以使操作有效
  • 矩陣逐個向量,一維數組被提升為列向量 (Nx1)
  • 一個向量一個向量,左操作數被提升為行向量,右操作數被提升為列向量,和前面的兩種情況一樣

作為最后一種情況的結果,我們在兩個向量之間有一個正常的內積。 這個策略既合乎邏輯又實用,因為內積的使用頻率更高。

dot product的維基文章將其定義為

在代數上,點積是兩個數字序列的相應條目的乘積之和。

(它多次提到inner product ,但沒有提到outer產品。)

如果您將 1d arrays 視為數字序列,那么A@B作為點積是自然的。

二維矩陣積可以描述為 A 的所有行與 B 的列的dot product

matmuldot中的關鍵術語是“產品的總和”。

對於一維數組, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM