axis 是数组 shape 元组中维度的索引号,指定 axis=i 即沿第 i 维操作并压缩该维;例如 shape=(4,3,2) 时,axis=0 对应长度为 4 的维度,sum 后结果为 (3,2)。

axis 不是“行”或“列”的代称,而是数组形状元组中维度的索引号。你指定 axis=i,NumPy 就会沿着第 i 个维度执行操作,并把该维度“压缩掉”。
axis 对应 shape 元组的索引
NumPy 数组的 shape 是一个元组,比如 arr.shape == (4, 3, 2),它有三个维度,对应三个轴:
-
axis=0→ 对应shape[0](值为 4) -
axis=1→ 对应shape[1](值为 3) -
axis=2→ 对应shape[2](值为 2)
所有带 axis 参数的函数(如 np.sum、np.mean、np.max、np.concatenate)都按这个规则工作。
-
np.sum(arr, axis=0):结果形状为(3, 2)(删掉第 0 维) -
np.sum(arr, axis=1):结果形状为(4, 2)(删掉第 1 维) -
np.sum(arr, axis=2):结果形状为(4, 3)(删掉第 2 维)
这比记“0 是列方向”更可靠——因为二维时容易混淆,三维以上根本没“行列”概念。
常见错误:把 axis=0 当成“对每行操作”
这是最典型的误解。实际是:
-
axis=0表示“在第 0 维上聚合”,即把所有索引[0, ...]、[1, ...]、[2, ...]的切片合并 - 对二维数组
arr(shape=(m, n)),arr[0]、arr[1]、…、arr[m-1]都是长度为n的一维子数组;np.sum(arr, axis=0)就是把这些子数组逐元素相加,得到一个长度为n的结果
容易踩的坑:
- 误以为
axis=0是“对每一行求和”,其实它是“把所有行叠起来,在垂直方向加” - 在
np.concatenate中错用axis:拼接两个(2,3)数组时,axis=0得到(4,3),axis=1得到(2,6),反了就报ValueError: all the input arrays must have same number of dimensions - 忘记
keepdims=True的作用:默认keepdims=False,压缩后维度减少,可能破坏广播兼容性;调试时加keepdims=True能快速验证轴选择是否符合预期
高维数组中快速判断 axis 的方法
面对 arr.shape == (a, b, c, d):
- 想保留前两维、压缩后两维?→ 不能直接用单个
axis,得链式调用或改用np.sum(..., axis=(2, 3)) - 想只压缩第 1 维(即
b那一维)?→ 用axis=1,结果形状为(a, c, d) - 不确定该选哪个
axis?临时打印切片验证:print(arr[0].shape) # 看 axis=0 切出来的子数组形状 print(arr[:, 0].shape) # 看 axis=1 切出来的形状 print(arr[:, :, 0].shape) # 看 axis=2 切出来的形状
本质就是:axis=i 的操作,等价于对所有 arr[..., 0, ...]、arr[..., 1, ...]、… 沿该位置索引变化的方向做归约或拼接。
真正卡住人的不是语法,而是习惯性用“表格思维”去套高维数据。一旦开始把 axis 和 shape 索引严格对齐,三维、四维甚至五维数组的操作逻辑就完全一致了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











