np.argmax() 默认在展平后的一维数组上返回最大值索引;axis=0时返回每列最大值的行号,axis=1时返回每行最大值的列号;遇重复最大值只返首个位置;含NaN时返回首个NaN位置,需用np.nanargmax()忽略NaN。

np.argmax() 返回的是哪个轴上的索引?
它默认在**展平后的一维数组**上找最大值位置,不是你直觉里“第一行”或“最后一列”的那个索引。比如 arr.shape == (3, 4),np.argmax(arr) 返回的是 0–11 范围内的整数,对应 arr.ravel() 的下标。
要按行或列找,必须显式传 axis 参数:
-
np.argmax(arr, axis=0):每列最大值的行号,结果形状是(4,) -
np.argmax(arr, axis=1):每行最大值的列号,结果形状是(3,)
漏掉 axis 是新手最常踩的坑——你以为拿到了“每行最大值的列位置”,结果得到一个标量,后续用它去索引原数组直接报错 IndexError: index 7 is out of bounds for axis 0 with size 3。
argmax 遇到重复最大值怎么办?
它只返回**第一个匹配位置**的索引,不管后面还有几个一样大的值。这点和 Python 原生的 list.index(max(list)) 行为一致,但容易被误以为能“找出所有最大值位置”。
如果真需要全部位置,得换方法:
- 用
np.where(arr == arr.max())得到坐标元组,再用np.column_stack()拼成二维索引数组 - 或者先用
np.flatnonzero(arr == arr.max())拿到所有一维位置
注意 arr.max() 和 np.max(arr) 等价,但别写成 arr.argmax()——那是索引,不是值,比较会出错。
np.argmin() 和 np.argmax() 用法完全对称吗?
是的,除了找最小值 vs 最大值,其余行为 100% 一致:默认展平、支持 axis、遇到重复只返首个、返回类型都是 int64(除非数组 dtype 特别小)。
但有个隐蔽差异:当输入含 NaN 时,两者都返回 0(或第一个 NaN 位置),不报错也不跳过——这和 np.nanmax()/np.nanargmax() 完全不同。
- 想忽略
NaN找有效最大值索引?必须用np.nanargmax(arr) - 混用
np.argmax()和含NaN数组,结果大概率是错的,且很难 debug
用 argmax 索引原数组时为什么经常 IndexError?
因为 np.argmax() 返回的是“位置”,不是“坐标”。直接拿它去索引二维数组,Python 会当成对第 0 轴切片,比如 arr[np.argmax(arr)] 实际执行的是 arr[5],相当于取第 5 行——而你的数组可能只有 3 行。
正确姿势分场景:
- 要取最大值本身:
arr.flat[np.argmax(arr)]或arr.ravel()[np.argmax(arr)] - 要取对应位置的其他数组元素(如标签):
labels[np.argmax(scores)],前提是labels和scores一一对应且同长 - 要取二维坐标再索引:
idx = np.unravel_index(np.argmax(arr), arr.shape); arr[idx]
最常被忽略的是 .flat 这个属性——它提供一维迭代器,支持整数索引,比 ravel() 更轻量,还不拷贝数据。










