对于二维数组,它相当于矩阵乘法;对于一维数组,它是向量的内积(不进行复共轭)。对于N维数组,它是a的最后一个轴和b的倒数第二个轴的和积:
对于一维数组,它是向量的普通内积(不进行复共轭);在更高维度中,它是a的最后几个轴和b的最后几个轴的和积。
(强调是作者加的.)
举个例子,考虑以下的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]])
因此,你应该使用适合你的应用程序的能够提供正确行为的方法。
性能测试
(请注意,我仅测试了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
对应于“张量积”,并包括维基百科页面底部提到的情况。一般用于两个类似张量的乘法以生成新的张量。它包括矩阵-矩阵乘法。
如果您不使用张量,则无需担心这些情况,它们的行为是相同的。
np.dot
现在(即在 Python 3 中)是矩阵乘法,无论维度如何。因此,它与 np.inner
不同,即使对于 1-D 数组也是如此。 - James Hirschorn对于一维和二维数组,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]]
。
这是我知道的全部,不知道它在高维情况下有什么作用。
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)
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]])
你可以在这里找到代码:
timeit
进行一些分析(更容易)。 - huon.dot
的第一个值为(111+213)。那么你如何计算你的例子中.inner
的第一个值呢? - Milla Wellc = np.dot(a,b)
和d = np.inner(a,b)
,则c[i,j] == sum(a[i,:] * b[:,j])
且d[i,j] == sum(a[i,:] * b[j,:])
。 - huonnp.dot(a, b) == np.inner(a, b.T)
和np.dot(a, b.T) == np.inner(a, b)
。 - senderle