numpy中广播(broadcast)的一个小坑

鉴于numpy中矩阵的运算居多,所以以下内容中参与运算的数据元素都默认为矩阵,且以矩阵的逐元素相乘这个操作为例子进行说明。

numpy中的广播(broadcast)说白了就是干一件事——扩展矩阵,而且扩展对象都是纬度比较小的矩阵,将维度较小的矩阵扩展到和维度较大的矩阵二者具有相同的维度,我们以逐元素相乘这个操作举个例子:

a = np.random.randn(3, 3)
b = np.random.randn(3, 1) # b = np.random.randn(1, 3)结果也是(3,3)
c = a * b #(3,3),数值为a、b矩阵对应位置元素相乘

上图中的矩阵a的维度比矩阵b的维度要高,为了能够进行逐元素相乘的操作,需要对b进行维度扩展,扩展的目标就是将b在形状上变得和a一模一样,也就是从(3, 1)变成(3, 3),扩展的方式就是将b原有的一列复制两遍,加上原来的一列就变成了三列,这样b就从原来的(3,1)变成了(3,3)。如果b是(1,3),扩展方式就是将b唯一的一行复制两遍变成三行,进而变成(3,3)。
归根结底,广播就是复制行或者列,但是这里有一个小坑,就是在没有扩展之前,a、b两个矩阵的行数或者列数必须有一个相同,否则无法扩展
也就是说a、b要么行数相同,要么列数相同才能进行扩展,否则无法扩展。

例如下面这段代码中a * b会报错,因为逐元素相乘需要两个矩阵维度相同,但是实际不相同,这时候就需要广播,但是两个矩阵行数、列数均不相同,无论怎么扩展都不能将其变成相同的维度。

a = np.random.randn(2, 3)
b = np.random.randn(3, 2)
c = a * b #报错,因为运算符 “*”指明了这是逐元素相乘,前提是两个矩阵维度相同

再次重申:以上的操作都有一个前提——需要执行广播操作,但是其他的不需要执行广播的操作,就不用考虑这个,例如矩阵的乘法,只要第一个矩阵的列数和第二个矩阵的行数相同即可,不需要执行广播操作,例如下面代码

a = np.random.randn(2, 3)
b = np.random.randn(3, 2)
c = np.dot(a, b) #这个操作才是矩阵相乘
print(np.shape(c)) #(2, 2)

总结成一句话:numpy在进行广播时,要求两个矩阵的行数或者列数必须有一个是相同的,否则无法进行广播。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值