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

本文探讨了在Numpy中,当array的维度为2D时np.dot和np.matmul函数产生的相同效果,以及在3D情况下两者区别。在3D场景下,matmul在最后两维进行矩阵乘法,而dot将最后一维视为向量进行逐对乘法,导致结果维度和含义的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用相同的情况

在若两个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∗22*222的矩阵,因此通过对应位置矩阵进行矩阵乘法,会得到2个2∗22*222的结果

>>> 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∗22*222个向量,b中有2∗22*222个向量,dot会将a的向量与b的向量全部组合在一起,因此会有(2∗2)∗(2∗2)(2*2)*(2*2)(22)(22)种结果。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值