广播

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

低纬度向高维度广播。低纬度在高维度方向上复制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np 

a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
bb = np.tile(b, (4, 1)) # 重复 b 的各个维度
print(a + bb)
输出结果为:

[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]

广播原则

广播的规则:

  • 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
  • 输出数组的形状是输入数组形状的各个维度上的最大值。
  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
  • 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

主动广播

1
2
3
numpy.broadcast
broadcast_arrays
broadcast_to

Manually adding two vectors, using broadcasting:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])
b = np.broadcast(x, y)
out = np.empty(b.shape)
out.flat = [u+v for (u,v) in b]
out
array([[5., 6., 7.],
[6., 7., 8.],
[7., 8., 9.]])
Compare against built-in broadcasting:

x + y
array([[5, 6, 7],
[6, 7, 8],
[7, 8, 9]])