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

Mik*_*kin 2 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 runs, 100 loops each)
%timeit a @ b        #15.1 ms ± 779 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Run Code Online (Sandbox Code Playgroud)

iz_*_*iz_ 5

除了少数例外,它们几乎相同。

a.dot(b)并且np.dot(a, b)完全一样。见numpy.dotndarray.dot

但是,查看以下文档numpy.dot

如果 a 和 b 都是二维数组,则是矩阵乘法,但首选使用matmula @ b

a @ b对应于numpy.matmul(a, b)dotmatmul区别如下:

matmul区别于dot两个重要方面:

  • 不允许与标量相乘,请*改用。
  • 矩阵堆栈一起广播,就好像矩阵是元素一样,尊重签名(n,k),(k,m)->(n,m)
>>> 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
Run Code Online (Sandbox Code Playgroud)