np.sum()默认展平数组求和;axis=0按列聚合,axis=1按行聚合;keepdims=True保留维度避免广播错误;大数组需指定dtype防溢出或精度损失。

np.sum() 默认求和行为:不指定 axis 就 flatten
不传 axis 参数时,np.sum() 会先把整个数组展平成一维再求和,跟你想的“按行”或“按列”完全无关。这点容易误判,尤其刚从 pandas 转过来的人——pandas 的 sum() 默认是 axis=0(按列),但 NumPy 不是。
- 二维数组
a = np.array([[1,2],[3,4]]),np.sum(a)返回10,不是[4, 6]也不是[3, 7] - 想保留维度结构?必须显式写
axis,不能靠“默认” - 高维数组更危险:
np.sum(a_3d)会吞掉所有轴,只剩一个标量
axis=0 和 axis=1 到底对应哪一维?看索引方向
NumPy 的 axis 指的是“被压缩的轴”,不是“保留的轴”。axis=0 表示沿第 0 轴(行方向)操作,结果中该轴消失;对二维数组来说,就是“按列聚合”,即每列内部相加,输出长度为列数的一维数组。
-
np.sum(a, axis=0)→ 每列求和 →[4, 6](原数组两列,结果两个数) -
np.sum(a, axis=1)→ 每行求和 →[3, 7](原数组两行,结果两个数) - 记法建议:把数组想象成表格,
axis=0是“从上往下压扁”,axis=1是“从左往右压扁” - 三维数组别硬背:
a.shape == (2,3,4)时,axis=1压缩中间那个长度为 3 的轴,结果 shape 变成(2,4)
keepdims=True:避免维度塌缩导致广播失败
默认情况下,np.sum() 会删掉被聚合的轴,shape 改变。这在后续做广播运算(比如减去均值)时极易报错:ValueError: operands could not be broadcast together。
- 例如:
a = np.random.rand(4,5),row_sums = np.sum(a, axis=1)得到 shape(4,),无法直接a - row_sums - 加
keepdims=True:np.sum(a, axis=1, keepdims=True)输出 shape(4,1),能正确广播 - 注意:
keepdims不影响数值,只保留被压缩轴的长度为 1 - 常见搭配:
a - np.mean(a, axis=1, keepdims=True)标准化每行,不会出维度错
性能与 dtype 注意:大数组求和可能溢出或变慢
np.sum() 默认用输入数组的 dtype 累加,整型数组(如 int8、uint16)容易因中间结果溢出得到错误值;浮点数则可能有精度损失或速度差异。
-
np.sum(np.array([200, 200], dtype=np.int8))返回-16(溢出),不是400 - 解决方法:显式指定
dtype参数,如np.sum(a, dtype=np.int64)或np.sum(a, dtype=np.float64) - 对 float32 数组,
dtype=float64虽稍慢但更准;对超大数组,可考虑np.add.reduce()(底层更轻量) - 注意:
np.sum()对 bool 数组等价于计数,但np.count_nonzero()更直白且略快
实际用的时候,axis 和 keepdims 这俩参数几乎总要一起琢磨,光调对结果还不行,得看后续怎么接——维度断了,后面全卡住。










