一尘不染

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

python

区别

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

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

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


阅读 141

收藏
2022-05-16

共1个答案

一尘不染

numpy.dot

对于二维数组,它相当于矩阵乘法,对于一维数组,它相当于向量的内积(没有复共轭)。对于 N 维,它是 a 的最后一个轴和b的倒数第二个的和积:

numpy.inner

一维数组(没有复共轭)的向量的普通内积,在更高维度上是最后一个轴的和积。

(强调我的。)

作为一个例子,考虑这个带有二维数组的例子:

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

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


性能测试

(请注意,我只测试一维情况,因为这是唯一.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更快,但我的机器目前负载相当大,所以时间不一致,也不一定非常准确。

2022-05-16