和有什么区别
import numpy as np
np.dot(a,b)
和
import numpy as np
np.inner(a,b)
我尝试的所有示例都返回了相同的结果。维基百科对两者都有相同的文章?!在它的描述中inner()
说,它的行为在更高维度上是不同的,但我无法产生任何不同的输出。我应该使用哪一个?
对于二维数组,它相当于矩阵乘法,对于一维数组,它相当于向量的内积(没有复共轭)。对于 N 维,它是 a 的最后一个轴和b的倒数第二个轴的和积:
一维数组(没有复共轭)的向量的普通内积,在更高维度上是最后一个轴上的和积。
(强调我的。)
作为一个例子,考虑这个带有二维数组的例子:
>>> a=np.array([[1,2],[3,4]])
>>> b=np.array([[11,12],[13,14]])
>>> np.dot(a,b)
array([[37, 40],
[85, 92]])
>>> np.inner(a,b)
array([[35, 41],
[81, 95]])
因此,您应该使用的那个是为您的应用程序提供正确行为的那个。
性能测试
(请注意,我只测试 1D 案例,因为这是唯一给出相同结果的情况.dot
。.inner
)
>>> import timeit
>>> setup = 'import numpy as np; a=np.random.random(1000); b = np.random.random(1000)'
>>> [timeit.timeit('np.dot(a,b)',setup,number=1000000) for _ in range(3)]
[2.6920320987701416, 2.676928997039795, 2.633111000061035]
>>> [timeit.timeit('np.inner(a,b)',setup,number=1000000) for _ in range(3)]
[2.588860034942627, 2.5845699310302734, 2.6556360721588135]
所以也许.inner
更快,但我的机器目前负载相当大,所以时间不一致,也不一定非常准确。
np.dot
并且np.inner
对于一维数组是相同的,所以这可能就是您没有注意到任何差异的原因。对于 N 维数组,它们对应于常见的张量操作。
np.inner
有时被称为高阶和低阶张量之间的“向量积”,特别是张量乘以向量,并且经常导致“张量收缩”。它包括矩阵向量乘法。
np.dot
对应于“张量积”,包括维基百科页面底部提到的情况。它通常用于将两个相似的张量相乘以产生一个新的张量。它包括矩阵-矩阵乘法。
如果您不使用张量,则无需担心这些情况,它们的行为相同。
对于 1 维和 2 维数组 numpy.inner 用作转置第二个矩阵然后相乘。因此对于:
A = [[a1,b1],[c1,d1]]
B = [[a2,b2],[c2,d2]]
numpy.inner(A,B)
array([[a1*a2 + b1*b2, a1*c2 + b1*d2],
[c1*a2 + d1*b2, c1*c2 + d1*d2])
我使用以下示例解决了这个问题:
A=[[1 ,10], [100,1000]]
B=[[1,2], [3,4]]
numpy.inner(A,B)
array([[ 21, 43],
[2100, 4300]])
这也解释了一维的行为,numpy.inner([a,b],[c,b]) = ac+bd
并且numpy.inner([[a],[b]], [[c],[d]]) = [[ac,ad],[bc,bd]]
。这是我的知识范围,不知道它对更高维度有什么作用。
内部无法正常处理复杂的二维数组,尝试相乘
及其转置
array([[ 1.+1.j, 4.+4.j, 7.+7.j],
[ 2.+2.j, 5.+5.j, 8.+8.j],
[ 3.+3.j, 6.+6.j, 9.+9.j]])
你会得到
array([[ 0. +60.j, 0. +72.j, 0. +84.j],
[ 0.+132.j, 0.+162.j, 0.+192.j],
[ 0.+204.j, 0.+252.j, 0.+300.j]])
有效地将行乘以行而不是行乘以列
在高维空间中,内积和点积有很大的不同。下面是 2x2 矩阵和 3x2 矩阵的示例 x = [[a1,b1],[c1,d1]] y= [[a2,b2].[c2,d2],[e2,f2]
np.inner(x,y)
输出 = [[a1xa2+b1xb2 ,a1xc2+b1xd2, a1xe2+b1f2],[c1xa2+d1xb2, c1xc2+d1xd2, c1xe2+d1xf2]]
但在点积的情况下,输出显示以下错误,因为您不能将 2x2 矩阵与 3x2 相乘。
ValueError:形状(2,2)和(3,2)未对齐:2(dim 1)!= 3(dim 0)
我制作了一个快速脚本来练习内积和点积数学。它真的帮助我感受到了不同之处:
你可以在这里找到代码: