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