import numpy as np
一、介绍
当两个形状不同的数组进行运算,就会产生广播,这时两个数组会采取某种自然的方式进行扩展,使两个数组的形状相同,之后再参加运算。
二、广播的准则
- 所有输入数组都向其中维数最多的数组看齐,shape属性中不足的部分通过在前面加1补齐(维度扩展);
- 输出数组的shape属性是输入数组的shape属性的各个轴上的最大值;
- 如果输入数组的某个轴的长度为1或与输出数组的对应轴的长度相同,这个数组能够用来计算,否则出错;
- 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值;
三、图解示例
1.最上边一行就是形状相同的数组相加;
2.中间的一行
- 第一个数组的shape为(4,3),第二个数组的shape为(1,3),故输出的shape为(4,3)
- 沿轴为1的方向使用重复的方式进行扩展,使两个数组的形状相同
3.最后一行
- 第一个数组的shape为(4,1),第二个数组的shape为(1,3),因为输出数组是所有轴上的最大值,故输出数组的shape为(4,3)
- 第一个数组扩展为(4,3),第二个数组扩展为(4,3),最后进行运算
四、代码示例
创建二维数组a和一维数组b
a = np.arange(0,60,10).reshape(-1,1)
b = np.arange(0,5)
print(a.shape)
print(b.shape)
(6, 1)
(5,)
广播
# 由于b是一维数组,故在其shape属性的前面加1,将其转换为二维数组(1,5)。
# 此时a.shape为(6,1),b.shape为(1,5),则a+b的结果应该是(6,5);
c = a + b
print(c)
print(c.shape)
[[ 0 1 2 3 4]
[10 11 12 13 14]
[20 21 22 23 24]
[30 31 32 33 34]
[40 41 42 43 44]
[50 51 52 53 54]]
(6, 5)
五、产生广播类型的数组:ogrid和mgrid
1.ogrid:产生两个不同维度的向量
# 产生两个向量,其shape分别为:(5,1)和(1,5)
x,y = np.ogrid[:5,:5]
print(x)
print(y)
[[0]
[1]
[2]
[3]
[4]]
[[0 1 2 3 4]]
2.mgrid:直接产生了ogrid中两个向量广播后的矩阵
x,y = np.mgrid[:5,:5]
print(x)
print(y)
[[0 0 0 0 0]
[1 1 1 1 1]
[2 2 2 2 2]
[3 3 3 3 3]
[4 4 4 4 4]]
[[0 1 2 3 4]
[0 1 2 3 4]
[0 1 2 3 4]
[0 1 2 3 4]
[0 1 2 3 4]]
x,y = np.ogrid[:1:4j,:1:3j]
print(x)
print(y)
[[ 0. ]
[ 0.33333333]
[ 0.66666667]
[ 1. ]]
[[ 0. 0.5 1. ]]
六、将一维数组转换为更高维数组进行广播
1.新加轴法
x = np.array([0,1,4,10])
y = np.array([2,3,8])
print(x.shape)
print(y.shape)
print(x[None,:]+y[:,None])
(4,)
(3,)
[[ 2 3 6 12]
[ 3 4 7 13]
[ 8 9 12 18]]
2.ix_()函数可以自动扩充到可以进行运算的维度
gy,gx = np.ix_(y,x)
gx+gy
array([[ 2, 3, 6, 12],
[ 3, 4, 7, 13],
[ 8, 9, 12, 18]])