[英]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.