广播机制(定义):
广播(Broadcast)是numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。
如果两个数组a和b形状相同,即满足a.shape==b.shape,那么a*b的结果就是a与b数组对应位相乘。这要求维数相同,且各维度的长度相同
例如(1):
a=np.array([1,2,3,4])
b=np.array([10,20,30,40])
c=a*b
print(c)
但如果两个形状不同的数组呢?它们之间就不能做算术运算了吗?
为了保持数组形状相同,numpy设计了一种广播机制,这种机制的核心是对形状较小的数组,在横向或纵向上进行一定次数的重复,使其与形状较大的数组拥有相同的维度
例如(2):
a=np.array([[0,0,0],
[10,10,10],
[20,20,20],
[30,30,30]])
b=np.array([0,1,2])
print(a+b)
广播的规则:
1、让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加1补齐
2、输出数组的形状是输入数组形状的各个维度上的最大值
3、如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为1时,这个数组能够用来计算,否则出错(右对齐时:相同或者为1)
4、当输入数组的某个维度的长度为1时,沿着此维度运算时都用此维度上的第一组值
为了更清楚的理解这些规则,来看几个具体的实例
例(3)
M=np.ones((2,3))
print(M)
a=np.arange(3)
print(a)
print(M.shape)
print(a.shape)
可以看到a组的维度最小,所以在其左边补1,变成 M.shape-->(2,3) a.shape--->(1,3)
对于广播规则的另一种简单理解
1、将两个数组的维度大小右对齐,然后比较对应维度上的数值
2、如果数值相等或其中有一个为1或者为空,则能进行广播运算
3、输出的维度大小为取数值大的数值。 否则不能进行数组运算
# 数组a大小为(2,3)
a=np.arange(6).reshape(2,3)
print('a:',a)
#数组b大小为(1,)
b=np.array([5])
print('b:',b)
c=a*b
c
#数组大小为(2,1,3)
a=np.arange(6).reshape(2,1,3)
print('a:',a)
#输出大小为(4,1)
b=np.arange(4).reshape(4,1)
print('b:',b)
c=a+b
print(c,c.shape)
从这里能够看出:
1、两个数组右对齐以后,对应维度里的数值要么相等,要么为1,要么缺失取最大的值
2、除此之外就会报错。像选的两个数组就不能做运算¶