matrixmatrix乘法的函数numpy.dot()、@和方法.dot()之间有什么区别?

2024-03-28 09:13:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

Tags: ofdevloopnprunsrandommeandot
2条回答

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

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

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

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

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

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

a.dot(b)np.dot(a, b)完全相同。见^{}^{}

然而,看看numpy.dot的文档:

If both a and b are 2-D arrays, it is matrix multiplication, but using matmul or a @ b is preferred.

a @ b对应于^{}dotmatmul的区别如下:

matmul differs from dot in two important ways:

  • Multiplication by scalars is not allowed, use * instead.
  • Stacks of matrices are broadcast together as if the matrices were elements, respecting the signature (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

相关问题 更多 >