NumPy 广播(Broadcast)¶
广播让形状不同但兼容的数组参与逐元素运算,而无需真正复制较小数组。它是向量化表达批量偏移、缩放、归一化和网格计算的核心机制。
广播规则¶
从两个 shape 的最右侧维度向左比较:
- 两个维度相等时兼容。
- 任一维度为 1 时兼容,该维逻辑扩展到另一方大小。
- 缺失的左侧维度按 1 处理。
- 其他组合不兼容,会抛出
ValueError。
例如 (2, 3, 4) 与 (3, 1) 的结果 shape 为 (2, 3, 4);(2, 3) 与 (2,) 不兼容。
可运行示例¶
import numpy as np
scores = np.array([[80, 90, 70], [85, 88, 92]])
bonus = np.array([2, 0, 3])
print(scores + bonus)
# 每行减去自己的均值。
row_mean = scores.mean(axis=1, keepdims=True)
centered = scores - row_mean
print(centered)
print(centered.mean(axis=1))
print(np.broadcast_shapes(scores.shape, bonus.shape))
通过插入轴构造外积:
import numpy as np
x = np.array([1, 2, 3])
y = np.array([10, 20])
outer = y[:, None] * x[None, :]
print(outer)
常见错误与性能注意事项¶
- 广播按尾部维度对齐。长度同为
n的一维数组不会自动被理解为行向量或列向量,应使用None明确方向。 keepdims=True保留聚合轴,通常能让结果直接广播回原数组。- 广播视图本身几乎不占额外数据内存,但后续运算的完整结果仍要分配;
m x n外积可能很大。 - 不要用
np.tile模拟本可直接广播的操作,tile会物化重复数据。 np.broadcast_to返回只读视图,多个逻辑位置可能指向同一内存,不应强行写入。- shape 恰好兼容不代表业务语义正确。关键计算应断言维度含义,并优先使用清晰的轴命名约定。