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

Mil*_*ell 53 python numpy matrix

有什么区别

import numpy as np
np.dot(a,b)
Run Code Online (Sandbox Code Playgroud)

import numpy as np
np.inner(a,b)
Run Code Online (Sandbox Code Playgroud)

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

huo*_*uon 55

numpy.dot:

对于2-D阵列,它相当于矩阵乘法,对于1-D阵列相当于矢量的内积(没有复共轭).对于N维,它是a的最后一个轴和b 的倒数第二个的和积:

numpy.inner:

用于1-D阵列的矢量的普通内积(没有复共轭),在更高维度上是最后轴上的和积.

(强调我的.)

作为示例,请考虑使用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]])
Run Code Online (Sandbox Code Playgroud)

因此,您应该使用的是为您的应用程序提供正确行为的那个.


性能测试

(请注意,我只测试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]
Run Code Online (Sandbox Code Playgroud)

所以也许.inner速度更快,但我的机器此刻负载很重,所以时间不一致,也不一定非常准确.

  • 表达差异的另一种方式是说它们对于向量是相同的,但对于2-d数组,`np.dot(a,b)== np.inner(a,bT)`和`np. dot(a,bT)== np.inner(a,b)`. (9认同)
  • @MillaWell,你是对的.设``c = 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,:])`. (6认同)
  • @MillaWell,即使对于2D数组,它们也有所不同:它们在1D中只是相同的。我不知道任何性能差异,有两种测试方法:[读取源代码](https://github.com/numpy/numpy/blob/master/numpy/core/blasdot/_dotblas.c)(不容易)或使用“ timeit”进行分析(要容易得多)。 (2认同)

mar*_*ard 18

np.dot并且np.inner对于1维数组是相同的,因此这可能是您没有注意到任何差异的原因.对于N维数组,它们对应于常见的张量操作.

np.inner有时被称为高阶和低阶张量之间的"向量积",特别是向量的张量乘以,并且经常导致"张量收缩".它包括矩阵向量乘法.

np.dot对应于"张量产品",并且包括维基百科页面底部提到的案例.它通常用于两个相似张量的乘法以产生新的张量.它包括矩阵 - 矩阵乘法.

如果您没有使用张量,那么您不必担心这些情况,并且它们的行为相同.

  • 看起来 `np.dot` 现在是(即在 Python 3 中)矩阵乘法,无论维度如何。因此,即使对于一维数组,它也与 `np.inner` 不同。 (2认同)

小智 8

对于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])
Run Code Online (Sandbox Code Playgroud)

我使用以下示例来解决这个问题:

A=[[1  ,10], [100,1000]]
B=[[1,2], [3,4]]
numpy.inner(A,B)
array([[  21,   43],
       [2100, 4300]])
Run Code Online (Sandbox Code Playgroud)

这也解释了一个维度的行为,numpy.inner([a,b],[c,b]) = ac+bd以及numpy.inner([[a],[b]], [[c],[d]]) = [[ac,ad],[bc,bd]].这是我的知识范围,不知道它对更高维度的作用.