为什么两个numpy (n,)向量的矩阵@乘积是点积,而不是外积?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么两个numpy (n,)向量的矩阵@乘积是点积,而不是外积?相关的知识,希望对你有一定的参考价值。

如果我有 x.shape = (n,) 和 y.shape = (n,),那么 x @ y 返回它们的点积,而不是它们的外积。我想知道这是否有一些潜在的原因,或者是否只是为了方便。

谢谢。

答案

函数 np.matmul@ 操作符被引入到Python中,新函数被设计成类似于 np.dot 为合理。

那为什么 np.dot(vector, vector) 执行内部产品?

@,函数 np.dot 实际上,线性代数中的向量并不是1D数组,而是其中一个维度为1的矩阵,为了将1D数组与矩阵相乘,必须将前者提升为行向量或列向量,这里有三种情况。

  • 矩阵乘向量, 1D数组被提升为行向量(1xN)以使操作有效。
  • 矩阵按向量计算,1D数组晋升为列向量(Nx1)
  • 逐个向量,左操作数晋升为行向量,右操作数晋升为列向量,和前面两种情况一样。

在最后一种情况下,我们在两个向量之间有一个正常的内积,这个策略既符合逻辑又实用,因为内积被更多的使用。

另一答案

在维基文章中,我们可以看到 dot product 将其定义为

在代数上,点积是两个数列的相应项的乘积之和。

(它提到 inner product 多次 outer 无)。)

如果你把1d数组看作是数字序列,那么 A@B 作为点积是自然的。

二维矩阵乘积可以描述为? dot product A的所有行与B的所有列的关系。

关键项,在两个 matmuldot 是 "产品之和"。

对于1d数组。np.sum(A*B) 是产品之和的另一种表达方式,其中的 * 是元素的互换。

一个(m,1)@与一个(1,n)确实会产生一个(m,n)的外积,但那实际上是一个二维矩阵积,在共享的尺寸1维上进行了缩减。

我们不需要'乘积之和'机制来做一个 outer 两个1d数组的乘积。

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]])

以上是关于为什么两个numpy (n,)向量的矩阵@乘积是点积,而不是外积?的主要内容,如果未能解决你的问题,请参考以下文章

向量点积和叉积(向量积)

C:矩阵向量乘积,两个双数相乘给出错误符号

对应不同特征值的两个特征向量的乘积等于0,是这样吗?

3d 数组的 Numpy 元素乘积

matlab怎么实现矩阵的向量乘 急!

如何从两个数组中所有元素的乘积创建矩阵?