Python 用于矩阵乘法的函数numpy.dot()、@和方法.dot()之间有什么区别?

Python 用于矩阵乘法的函数numpy.dot()、@和方法.dot()之间有什么区别?,python,numpy,matrix-multiplication,Python,Numpy,Matrix Multiplication,有什么区别吗?如果不是,公约更倾向于什么? 演出似乎差不多 a=np.random.rand(1000,1000) b=np.random.rand(1000,1000) %timeit a.dot(b) #14.3 ms ± 374 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit np.dot(a,b) #14.7 ms ± 315 µs per loop (mean ± std. dev. of 7

有什么区别吗?如果不是,公约更倾向于什么? 演出似乎差不多

a=np.random.rand(1000,1000)
b=np.random.rand(1000,1000)
%timeit a.dot(b)     #14.3 ms ± 374 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.dot(a,b)  #14.7 ms ± 315 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit a @ b        #15.1 ms ± 779 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

他们基本上都在做同样的事情。就时间而言,根据Numpy的文件:

  • 如果a和b都是一维数组,则它是向量的内积 (没有复合共轭)

  • 如果a和b都是二维数组,则是矩阵乘法,但 最好使用
    matmul
    a@b

  • 如果a或b是0-D(标量),则相当于乘法和 使用
    numpy。首选乘法(a,b)
    a*b

  • 如果a是N-D数组,b是1-D数组,则它是
    a
    b
    的最后一个轴


它们几乎相同,只有少数例外

a.dot(b)
np.dot(a,b)
完全相同。见和

但是,查看
numpy.dot
的文档:

如果a和b都是二维数组,则为矩阵乘法,但最好使用
matmul
a@b

a@b
对应于
dot
matmul
的区别如下:

matmul
dot
有两个重要区别:

  • 不允许使用标量乘法,请改用
    *
  • 矩阵堆栈一起广播,就好像矩阵是 元素,关于签名
    (n,k)、(k,m)->(n,m)

对于2d示例,它们基本相同。对此没有
约定。
>>> a = np.ones([9, 5, 7, 4])
>>> c = np.ones([9, 5, 4, 3])
>>> np.dot(a, c).shape (9, 5, 7, 9, 5, 3)
>>> np.matmul(a, c).shape (9, 5, 7, 3)
>>> # n is 7, k is 4, m is 3