满足以下任意一种情况,都可能发生广播:
- 如果两个数组的末尾维度(trailing dimension)的长度相符;
- 参与计算的某个维度长度为 1,广播会在缺失和(或)长度为 1 的维度上进行
In [66]: a = np.array([[1],[-5],[3]])
In [67]: a
Out[67]:
array([[ 1],
[-5],
[ 3]])
In [71]: a.shape
Out[71]: (3, 1)
In [68]: b = np.array([[5,2,4,9]])
In [69]: b
Out[69]: array([[5, 2, 4, 9]])
In [72]: b.shape
Out[72]: (1, 4)
容易发现,参与计算的两个对象都出现了某个维度长度为1的情况,因此满足发生传播的条件。
根据广播机制,广播会发生在缺失或长度为 1 的维度上进行,比如 a 会在第二个维度上扩展成为 4, shape 变为 (3,4),扩展后的形状为:
In [75]: ae
Out[75]:
array([[ 1, 1, 1, 1],
[-5, -5, -5, -5],
[ 3, 3, 3, 3]])
b 同理会在第一个维度上扩展为 3, shape 也会变为 (3,4),扩展后的形状如下:
In [78]: be
Out[78]:
array([[5, 2, 4, 9],
[5, 2, 4, 9],
[5, 2, 4, 9]])
这样,对应元素就可以相加了,如下:
In [79]: ae + be
Out[79]:
array([[ 6, 3, 5, 10],
[ 0, -3, -1, 4],
[ 8, 5, 7, 12]])
最后一个细节,NumPy 的 ndarray 对象每个元素类型必须是一致的。这一点不同于原生的 Python,可以不同类型的元素出现在同一个 list 中。
