二维数组归约操作是对行或列执行聚合计算,axis=0按列归约得一维数组(长度=列数),axis=1按行归约得一维数组(长度=行数),需注意axis含义、缺失值处理及数据类型兼容性。

二维数组的行列归约操作,本质是对某一行或某一列的所有元素执行聚合计算(如求和、求最大值、求平均值等),结果为一维数组。关键在于明确归约方向(axis=0 沿行方向归约,即对每列操作;axis=1 沿列方向归约,即对每行操作),并确保数据类型和边界处理合理。
按列归约(axis=0):压缩行维度,输出长度等于列数
该操作遍历每一列,将该列所有行元素参与计算。例如对 3×4 数组求和,结果是含 4 个元素的一维数组,每个值对应原数组中一列的总和。
- NumPy 中直接调用 arr.sum(axis=0)、arr.max(axis=0) 等即可
- 手动实现时,可用列表推导式:[sum(arr[:, j]) for j in range(arr.shape[1])]
- 注意空列情况:若某列为全 NaN,需配合 np.nansum 或设置 skipna=True(Pandas)
按行归约(axis=1):压缩列维度,输出长度等于行数
该操作遍历每一行,将该行所有列元素参与计算。例如对 3×4 数组求均值,结果是含 3 个元素的一维数组,每个值代表对应行的平均值。
- NumPy 写法:arr.mean(axis=1),返回 shape 为 (3,) 的数组
- 手动实现示例(Python 原生):[sum(row)/len(row) for row in arr.tolist()],适用于小规模或教学场景
- 警惕整数除法陷阱:若 arr 是 int 类型且用 Python 原生除法,可能截断小数,建议显式转 float 或使用 np.true_divide
自定义归约函数与高阶用法
除内置函数外,可传入任意接受一维数组并返回标量的函数,增强灵活性。
- 用 np.apply_along_axis:如 np.apply_along_axis(lambda x: x[x > 0].sum(), axis=1, arr=arr) 计算每行正数之和
- 结合布尔索引做条件归约,例如每行非零元素的中位数:np.array([np.median(row[row != 0]) if np.any(row != 0) else 0 for row in arr])
- 多维归约链式调用:先 axis=1 得行统计,再对其结果 axis=0 汇总(如求所有行均值的方差)
常见错误与规避方法
归约操作看似简单,但易在维度理解、缺失值、数据类型上出错。
- 混淆 axis 含义:牢记 “axis 是要被消除的轴”,axis=0 消除第 0 轴(行),保留列;可记作 “collapse rows → keep columns”
- 忽略广播不匹配:归约后结果若用于后续运算(如与原数组相减),需注意形状是否兼容,必要时用 reshape(-1, 1) 或 [:, None] 升维
- 未处理全 NaN 行/列:直接调用 .sum() 会返回 NaN,应优先用 np.nansum 或加 where=... 条件掩码











