有什么区别吗?如果不是,按惯例首选什么?性能似乎几乎相同。
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的文档here:
如果a和b均为一维数组,则它是向量的内积(没有复杂的共轭)。
如果a和b均为二维数组,则为矩阵乘法,但是最好使用matmul
或a @ b
。
如果a或b为0-D(标量),则等于乘以和最好使用numpy.multiply(a, b)
或a * b
。
如果a是一个N-D数组而b是一维数组,则它是a
和b
的最后一个轴。
它们几乎相同,除了一些例外。
a.dot(b)
和np.dot(a, b)
完全相同。参见numpy.dot
和numpy.dot
。
但是,请查看ndarray.dot
的文档:
如果a和b均为二维数组,则为矩阵乘法,但最好使用
ndarray.dot
或numpy.dot
。
matmul
对应于a @ b
。 a @ b
和numpy.matmul(a, b)
的区别如下:
[
numpy.matmul(a, b)
与dot
的区别在两个重要方面:
- 不允许进行标量乘法,请改用
matmul
。- 将矩阵堆栈一起广播,就好像矩阵是元素,尊重签名
matmul
:dot