Numpy中np.dot与np.matmul的区别详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Numpy中np.dot与np.matmul的区别详解

ACTerminate   2023-03-21 我要评论

作用相同的情况

在若两个array的维度均为两维的情况下,两个函数的结果是相同的,例如:

a = np.array([i for i in range(6)]).reshape([2,3])
b = np.array([i for i in range(6)]).reshape([3,2])
"""
a
[[0 1 2]
 [3 4 5]]
b
[[0 1]
 [2 3]
 [4 5]] 
"""
>>> np.dot(a,b)
array([[10, 13],
       [28, 40]])
>>> np.matmul(a,b)
array([[10, 13],
       [28, 40]])

作用不同的情况

在三维的情况下,假设

a = np.array([i for i in range(12)]).reshape([2,2,3])
b = np.array([i for i in range(12)]).reshape([2,3,2])
"""
a
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
b
[[[ 0  1]
  [ 2  3]
  [ 4  5]]

 [[ 6  7]
  [ 8  9]
  [10 11]]]
"""
>>> np.matmul(a,b)
array([[[ 10,  13],
        [ 28,  40]],

       [[172, 193],
        [244, 274]]])
>>> np.matmul(a,b).shape
(2, 2, 2)

这是因为matmul将最后两维作为矩阵的两维,相当于有2个2 ∗ 2 2*22∗2的矩阵,因此通过对应位置矩阵进行矩阵乘法,会得到2个2 ∗ 2 2*22∗2的结果

>>> np.dot(a,b)
array([[[[ 10,  13],
         [ 28,  31]],

        [[ 28,  40],
         [100, 112]]],


       [[[ 46,  67],
         [172, 193]],

        [[ 64,  94],
         [244, 274]]]])
>>> np.dot(a,b).shape
(2, 2, 2, 2)

可以看到其结果与matmul不同并且结果是四维的,这是因为dot将a数组的最后一维作为向量,并将b数组的倒数第二维作为了另一个向量,因此a中可以看成有2 ∗ 2 2*22∗2个向量,b中有2 ∗ 2 2*22∗2个向量,dot会将a的向量与b的向量全部组合在一起,因此会有( 2 ∗ 2 ) ∗ ( 2 ∗ 2 ) (2*2)*(2*2)(2∗2)∗(2∗2)种结果。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们