numpy的np.matmul

转自https://blog.csdn.net/alwaysyxl/article/details/83050137
numpy.matmul
原型: numpy.matmul(a, b, out=None)
两个numpy数组的矩阵相乘
(1). 如果两个参数a,b a,ba,b都是2 22维的,做普通的矩阵相乘。

import numpy as np
a = [[1, 0], [0, 1]]
b = [[4, 1], [2, 2]]
np.matmul(a, b)
1
2
3
4
array([[4, 1],
[2, 2]])
1
2
(2). 如果某一个参数是N(N>2) N(N>2)N(N>2)维的,该参数被理解为一些矩阵(参数的最后两个维数为矩阵维数)的stack,而且计算时会相应的广播

a = np.arange(224).reshape((2,2,4))
b = np.arange(224).reshape((2,4,2))
c = np.arange(124).reshape((1,4,2))
np.matmul(a,b)
np.matmul(a,c)
1
2
3
4
5
out:
[[[ 28 34]
[ 76 98]]
[[428 466]
[604 658]]]

[[[ 28 34]
[ 76 98]]
[[124 162]
[172 226]]]
1
2
3
4
5
6
7
8
9
10
首先,对于a aa,它会被理解成两个2×4 2\times42×4的矩阵的stack

[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
1
2
3
4
同样对于b bb,它会被理解成两个4×2 4\times24×2的矩阵的stack

[[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]]
[[ 8 9]
[10 11]
[12 13]
[14 15]]]
1
2
3
4
5
6
7
8
那么np.matmul(a,b)则会将a aa的第一个矩阵和b bb的第一个矩阵相乘,将a aa的第二个矩阵b bb的第二个矩阵相乘,最终得到一个2×2×2 2\times2\times22×2×2的结果
同理,同样对于c cc,它会被理解成一个4×2 4\times24×2的矩阵的stack,对于np.matmul(a,c),则会广播c cc的一个矩阵,将a aa的第一个矩阵和第二个矩阵分别与c cc的一个矩阵相乘最终得到一个2×2×2 2\times2\times22×2×2的结果
(3). 如果第一个参数或者第二个参数是1 11维的,它会提升该参数为矩阵(根据另一个参数维数,给该参数增加一个为1的维数)。矩阵相乘之后会将为1的维数去掉。

import numpy as np
a = [[1, 0], [0, 1]]
b = [1, 2]
np.matmul(a, b)
np.matmul(b, a)
1
2
3
4
5
array([1, 2])
array([1, 2])
1
2
上述两种情况在计算矩阵相乘时,会分别将b bb提升为2×1 2\times12×1的矩阵和1×2 1\times21×2的矩阵。
(4). 乘一个标量是不被允许的,用∗ *∗代替。

np.matmul([1,2], 3)
1
ValueError: Scalar operands are not allowed, use ‘*’ instead
1
matmul与dot的差异主要在两个方面:
(1)不允许乘标量
(2)stack的矩阵将矩阵按元素对待被一起广播

作者:alwaysyxl
来源:CSDN
原文:https://blog.csdn.net/alwaysyxl/article/details/83050137
版权声明:本文为博主原创文章,转载请附上博文链接!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值