np.sort()返回排序后数组,np.argsort()返回升序索引;二者默认按最后一维(行)升序排,arr.sort()原地修改且返回None,误赋值将导致变量为None;argsort索引可用于重排任意同形数组,是其核心优势。

直接说结论:用 np.sort() 得排序后数组,用 np.argsort() 得排序索引;二者默认都按最后一维(行内)升序排,但 sort() 会原地修改(若作用于 ndarray 实例方法),而 argsort() 总是返回新数组。
为什么 arr.sort() 有时没反应?
因为 arr.sort() 是就地排序,不返回值(返回 None),如果写成 sorted_arr = arr.sort(),sorted_arr 就是 None,而 arr 本身已被改 —— 这是新手最常踩的坑。
- 要原地排序且不关心原数组:直接调
arr.sort(),别赋值 - 要保留原数组、拿到新排序数组:用函数式接口
np.sort(arr) -
np.sort()和arr.sort()行为一致,只是前者返回副本,后者改原数组 - 多维时,默认
axis=-1(即对每行排序);想按列排得显式写axis=0
argsort 返回的索引到底怎么用?
np.argsort() 不动原数据,只返回“把原数组排好序所需的下标位置”。它返回的是一组整数索引,可用于重排任意同形状数组 —— 这是它比 sort 更灵活的核心价值。
- 一维示例:
x = np.array([3, 1, 4]); idx = np.argsort(x)→idx是[1, 0, 2],那么x[idx]就等于np.sort(x) - 二维按行排序索引:
idx = np.argsort(arr, axis=1),此时np.take_along_axis(arr, idx, axis=1)才等价于np.sort(arr, axis=1)(注意:不能直接用arr[idx],维度不匹配) - 常用组合:按某列值排序整个二维表,如
idx = np.argsort(table[:, 2]),再用table[idx]重排整张表
升序/降序与稳定排序怎么控制?
np.sort() 和 np.argsort() 都支持 kind 和 order 参数,但日常最需关注的是降序和稳定性。
立即学习“Python免费学习笔记(深入)”;
- 降序:没有直接
reverse=True,得用切片反转或负号技巧。推荐np.argsort(-arr)(数值型)或np.argsort(arr)[::-1](通用) - 稳定排序:默认
kind='quicksort'不稳定;需稳定时传kind='mergesort'或kind='stable'(NumPy ≥ 1.15) - 结构化数组排序:用
order指定字段名,如np.sort(data, order='score') - 性能提示:稳定排序比快排慢 20–30%,仅当相等元素相对顺序必须保留时才启用
真正容易被忽略的是轴向行为和索引复用场景——比如对二维数组调 argsort(axis=0) 后得到的索引形状仍是二维,但直接用它花式索引时极易因维度错位报 IndexError;这时候该用 np.take_along_axis() 而不是手写花式索引。


















