广播机制
广播是numpy对不同形状的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行
1.如果两个数组a和b形状相同,即满足a.shape == b.shape,那么a*b的结果就是a与b数组对应位相乘。这要求维数相同且各维度的长度相同
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print(c)
[10, 40,90,160]
2.如果是两个形状不同的数据,广播机制的核心是对形状较小的数组,在横向或纵向上进行一定次数的重复,使其与形状较大的数组拥有相同的维度
a = np.array([[0,0,0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a+b)
原理如下图,数组b在一维的基础上扩展成重复的二维
4x3 的二维数组与长为 3的一维数组相加,等效于把数组b在二维上重复4 次再运算:
广播的规则:
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加1补齐
- 输出数组的形状是输入数组形状的各个维度上的最大值。
- 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为1时,这个数组能够用来计算,否则出错。
- 当输入数组的某个维度的长度为1时,沿着此维度运算时都用此维度上的第一组值。
对于广播规则另一种简单理解
- 将两个数组的维度大小右对齐,然后比较对应维度上的数值
- 如果数值相等或其中有一个为1或者为空,则能进行广播运算
- 满足条件2后,输出的维度大小为取数值大的数值。否则不能进行数组运算。
a的大小为2*3
b的大小为1*1
首先右对齐:
2 3
1
————————
2 3
最后得到2*3
a的大小为2*1*3
b的大小为4*1
2 1 3
4 1
—————————
2 4 3
最后得到2*4*3
a的大小为2*1*3
b的大小为4*2
2 1 3
4 2
—————————
3和2值上不相同,找1,没有1,不能运算
从这里能够看出:
- 两个数组右对齐以后,对应维度里的数值要么相等,要么为1,要么缺失取大值。
- 除此之外就会报错。
从这里能够看出:
- 两个数组右对齐以后,对应维度里的数值要么相等,要么为1,要么缺失取大值。
- 除此之外就会报错。