NumPy 广播与形状检查互动实验

广播不是“元素数量差不多就能算”,而是一场从最后一个轴开始的逐轴核对。先看 shape,再写运算,能避开许多不会报错却会悄悄扩张的结果。

每个对齐轴只允许两种情况:
尺寸相等,或其中一个尺寸是 1。缺少的前导轴按 1 处理。

从尾轴向前核对

(5,)
(5, 1)
(5, 5)
对齐轴A 的尺寸B 的尺寸判断结果尺寸
✓ 可以广播结果 shape 为 (5, 5)。注意:它不是 (5, 1),元素数从 5 变成了 25。

必须警惕:(5,) + (5,1) → (5,5)

(5,) 没有“行向量”或“列向量”的固定含义;它只有一个轴。与 (5,1) 尾轴对齐后,前者等价看作 (1,5),于是两个维度分别扩张,得到一个矩阵。

x.shape = (5,)
01234

尾轴长度 5;广播时补成 (1,5)。

y.shape = (5,1)
010203040

第一轴长度 5,尾轴长度 1。

x + y 的结果,shape = (5,5)

每一行都把 x 加到 y 的一个标量上。广播没有复制源数据,但最终结果确实包含 25 个元素。

约简后为什么常保留维度

X.shape=(3,5),沿 axis=1 求均值,再做中心化 X - mean。切换选项看 shape 是否还能按预期广播。

keepdims=Falsemean.shape=(3,);(3,5) − (3,) → 不兼容
keepdims=Truemean.shape=(3,1);(3,5) − (3,1) → (3,5)
✓ 形状安全保留被约简的轴为 1,均值会沿 5 列扩张,每一行减去自己的均值。

一分钟小测

A.shape=(4,1,3)B.shape=(1,5,1),那么 A+B 的 shape 是什么?

选择一个答案后,这里会逐轴解释。