繁体   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