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.dot
和np.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+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]])
有效地将行与行相乘,而不是将行与列相乘
内积和点积在高维空间上有很大的区别。 下面是一个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)