np.max()通过axis参数求行/列最大值:axis=0得每列最大值,axis=1得每行最大值;含NaN时须用np.nanmax();keepdims=True可保留维度避免广播错误。

用 np.max() 指定 axis 参数求行/列最大值
直接调用 np.max() 并设置 axis 是最常用也最可靠的方式。关键在于理解 axis 的含义:它表示“**沿着哪个轴塌缩**”,即该轴会被消掉,结果维度减少一维。
对二维数组 a(形状为 (m, n)):
-
axis=0→ 沿第 0 轴(行方向)操作 → 对每列分别求最大 → 返回长度为n的一维数组 -
axis=1→ 沿第 1 轴(列方向)操作 → 对每行分别求最大 → 返回长度为m的一维数组
示例:
import numpy as np
a = np.array([[1, 5, 3],
[7, 2, 9],
[4, 8, 6]])
<p>print(np.max(a, axis=0)) # [7 8 9] —— 每列最大值
print(np.max(a, axis=1)) # [5 9 8] —— 每行最大值为什么不用 np.amax() 或 a.max()?
np.amax() 和 np.max() 完全等价,只是别名,选哪个都行;而 a.max() 是 ndarray 实例方法,行为一致,但有两点要注意:
立即学习“Python免费学习笔记(深入)”;
- 它不支持
out、keepdims等底层控制参数(虽然日常够用) - 如果变量名恰好叫
max(比如max = 10),会覆盖内置函数,但a.max()不受影响 —— 这点反而更安全 - 在链式调用中(如
a.astype(float).max(axis=1)),实例方法更自然
所以没有本质区别,但推荐统一用 np.max(),避免混淆函数与变量名。
处理含 NaN 的数组时必须用 np.nanmax()
只要数组里有一个 NaN,np.max() 就会返回 nan,不会报错也不会跳过:
a_with_nan = np.array([[1, np.nan, 3],
[7, 2, 9]])
print(np.max(a_with_nan, axis=1)) # [nan 9.]这时候必须换用 np.nanmax(),它会自动忽略 NaN 值(但若整行/列全是 NaN,仍返回 nan):
print(np.nanmax(a_with_nan, axis=1)) # [3. 9.]
注意:np.nanmax() 同样支持 axis,行为与 np.max() 一致,只是语义上明确“跳过 NaN”。
keepdims=True 保留原始维度,避免广播出错
默认情况下,np.max(a, axis=1) 返回形状为 (m,) 的一维数组,而原数组是 (m, n)。如果后续要做广播运算(比如减去每行最大值做归一化),维度不匹配会报错:
# 错误:(3, 3) 和 (3,) 无法直接相减 a - np.max(a, axis=1) # ValueError
加 keepdims=True 可保持维度数不变,只压缩指定轴的大小为 1:
row_maxes = np.max(a, axis=1, keepdims=True) # 形状变为 (3, 1) a - row_maxes # ✅ 正确广播:(3,3) - (3,1) → (3,3)
这个参数在数据预处理中非常实用,但容易被忽略——尤其当错误提示看起来和维度无关时(比如 ValueError: operands could not be broadcast together),第一反应常是检查数据形状而非是否丢了维度。


















