为什么两个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的所有列的关系。
关键项,在两个 matmul
和 dot
是 "产品之和"。
对于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,)向量的矩阵@乘积是点积,而不是外积?的主要内容,如果未能解决你的问题,请参考以下文章