numpy dot()和inner()之间的区别

有什么区别

import numpy as np np.dot(a,b) 

 import numpy as np np.inner(a,b) 

我试过的所有例子都返回了相同的结果。 维基百科有两个相同的文章? 在inner() 的描述中 ,它说,它的行为在更高的维度是不同的,但我不能产生任何不同的输出。 我应该使用哪一个?

numpy.dot

对于二维arrays,它相当于matrix乘法,而一维arrays是向量的内积(无复共轭)。 对于N维,它是a的最后一个轴倒数和b 倒数第二个倒数

numpy.inner

用于一维arrays的vector的普通内积(无复共轭),在更高维度上是最后轴上的和积。

(强调我的)

作为一个例子,用2D数组考虑这个例子:

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

因此,你应该使用的是为你的应用程序提供正确的行为。


性能testing

(请注意,我只testing一维情况,因为这是唯一的情况,即.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] 

所以也许更快,但我的机器目前是相当的负载,所以时间不一致,也不一定非常准确。

对于一维数组, np.dotnp.inner是相同的,所以这可能是为什么你没有注意到任何差异。 对于N维数组,它们对应于常用的张量运算。

np.inner有时被称为高阶张量和低阶张量之间的“vector积”,尤其是张量乘以一个向量,常常导致“张量收缩”。 它包括matrix向量乘法。

np.dot对应于“张量积”,并且包括在维基百科页面底部提到的情况。 它通常用于两个相似张量的相乘以产生一个新的张量。 它包括matrix – matrix乘法。

如果你不使用张量,那么你不需要担心这些情况,他们的行为是一致的。

对于1维和2维数组,numpy.inner作为转置第二个matrix然后相乘。 因此对于:

 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+bdnumpy.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]]) 

有效地将行与行相乘,而不是将行与列相乘

内积和点积在高维空间上有很大的区别。 下面是一个2×2matrix和3×2matrix的例子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]]

但在点积的情况下,输出显示下面的错误,因为您不能乘以2x2matrix与3×2。

ValueError:形状(2,2)和(3,2)未alignment:2(dim 1)!= 3(dim 0)