Numpy的广播机制(附实例)

一、什么是Numpy的广播机制

numpy的广播机制是在不同shape的ndarray数组进行运算时,将其补足成相同shape再进行运算的机制
比如我们常常需要对一个数据矩阵的每个维度进行零均值化处理,就需要该维度的所有数据减去该维度的均值,代码如下

import numpy as np
# 模拟一个5*5大小的样本矩阵,每一行是一个样本的特征向量
DATA = np.random.permutation(5*5).reshape((5,5))
DATAMEAN = np.mean(DATA, axis=0) #对样本进行平均,得到一个shape为(1,5)的均值向量
DATA-DATAMEAN
print(DATA.shape)	# (5,5)
print(DATAMEAN.shape) # (1,5)

虽然这里DATA和DATAMEAN的shape不一样,但他们还是能够相减,这就是numpy的广播机制起的作用。

二、Numpy广播机制的规则

前面说到广播机制是为了对shape不同的数组(ndarray)进行运算而设计的,shape不同其实分为两类:1、维度不同,比如shape为(1,3,3)和shape为(3,3)的数组;2、形状不同(比如shape为(3,4,5)和shape为(5,5,5)的数据)
前面只对维度相同(DATA和DATAMEAN都是2维),形状不同的数据做了验证,其实形状不同也可以运算,示例如下

b = np.random.permutation(3*3*2).reshape((3,3,2))
print(b.shape)
c = np.array([1,2])
print(b-c)

上面的代码中,b是3维数组,shape是(3,3,2));c是1维数组,shape是(2,),也能正常相减而不报错。
根据我的总结,Numpy的广播机制在遇到shape不同的数组相运算时,按照以下步骤进行广播:
1. 检查维度是否相同,如果维度不同,在现有维度前补足维度
例如前面提到的c,其维度是1维,shape是(2,),补足后维度是3维,shape是(1,1,2),c从[1,2]变成了[[[1],[2]]]。这里注意补足的维度都是在前面补足的,就是说shape变成(1,1,2),而不会变成(2,1,1)
2.满足维度相同后,在维度长度为1的轴上对其他轴的数据进行复制
还是使用前面提到的c,在c的shape变成(1,1,2)之后,复制第3个轴的数据,使得广播完成后的afterc[x, y, i] = beforec[1, 1, i],其中x,y是任意满足条件的索引,i是未进行扩展的轴。

三、实例验证

前面已经有了两个代码实例,这里再放一个广播之后仍然不能计算的实例,大家可以照着前面的步骤,看看为什么会报错:

b = np.random.permutation(3*3*2).reshape((3,2,3))
print(b.shape)
c = np.array([1,2])
print(b-c)

这个例子和前面的例子类似,但我只改了b的shape。
可以看到,b的shape为(3,2,3),而c的shape为(2,),不管怎么添加维度,他们的最后一维始终不一样,所以不能补足成相同的shape。因此会报错,由此也可以看出,在维度不一样时,两个计算的数组的尾部shape必须一样才能补足(这里不够严谨,应该是如果维度不一样,则在左边添加维度比如形状为(2,1)的a和形状为(3,3,2,2,)的b运算,a被补足为(1,1,2,1),然后再对应维度查看维度是否相同,如果不同,则再看a或者b在该维度是否为1,如果为1,就进行复制,否则无法运算,比如这里a,b可以运算,a会被广播为(3,3,2,2)的shape,且(x,y,2,z)=(1,1,2,1)),不然无法运算。
下面还有一个例子:

b = np.random.permutation(3*3*2).reshape((3,2,3))
print(b.shape)
c = np.array([1,2,0])
print(b-c[:,None,None])

这个例子和前面的例子又有一点点不同,这里使用c[:, None, None]强行将c的shape变成了(3,1,1),这时b的shape是(3,2,3),广播机制会将c广播为shape(3,2,3),广播后的矩阵假设为afterc,满足afterc[i, x, y] = c[i, 1,1]。
其实不止numpy这样,MATLAB矩阵和pytorch张量都存在类似机制,其方式也相同,不过我没有进行实验比较,就不多说了。
至此广播机制就没什么可以说的了,前面都是根据我的实验总结得到的,如果有错误,请指出交流!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝域小兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值