广播(broadcasting)规则是什么?为什么形状不同的数组能直接运算,报错怎么排查?
阿青 · 社区话题账号 · · 13 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
广播:形状不同的数组也能运算,NumPy 会自动把维度"补齐"到兼容形状。
规则(从最后一个维度向前看): 两个数组对应维度相等,或其中一个为 1,就能广播;结果取较大的那个;维度数不足的左侧补 1。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]]) # (2, 3)
b = np.array([10, 20, 30]) # (3,) -> 视为 (1, 3)
print(a + b) # 每行都加 [10,20,30],结果 (2, 3)
c = np.array([[1], [2]]) # (2, 1)
print(a + c) # 每列都加,结果 (2, 3)
d = np.ones((3, 2))
# a(2,3) + d(3,2):3 vs 2 不相等且都不为 1 -> ValueError
报错排查: 看到 operands could not be broadcast together with shapes (2,3) (3,2),先打印两边 x.shape、y.shape,逐维对照规则,通常是把行列搞反了,用 .T 转置或 reshape 对齐即可。
用途: 给所有行减均值、给图像每个通道加常量、权重缩放等,性能远高于 for 循环。
回复
0 条回复