np.argsort 返回升序排列所需的索引序列;例如 a=[3,0,2] 时返回 [1,2,0],即 a[1],a[2],a[0] 构成升序数组,索引为 int64 类型,可用于安全重排而不修改原数组。

np.argsort 返回的是什么索引?
np.argsort 不返回排序后的数组,而是返回「让原数组升序排列所需的索引序列」。比如 a = np.array([3, 0, 2]),np.argsort(a) 返回 array([1, 2, 0]),意思是:取 a[1]、a[2]、a[0] 就能得到升序结果 [0, 2, 3]。
这个索引数组本身是整数类型(通常是 int64),可直接用于高级索引,不改变原始数组。
怎么用 argsort 实现“排序但保留原数据”?
核心就是两步:先算索引,再用它去取值或映射其他数组。常见组合方式:
- 获取排序后值:
a[np.argsort(a)]—— 安全,原a不变 - 对另一数组按
a排序:b[np.argsort(a)],前提是a和b长度一致 - 降序?加
[::-1]:idx = np.argsort(a)[::-1],或直接np.argsort(-a)(仅适用于数值) - 多维数组需指定
axis,例如按行排序:np.argsort(a, axis=1)
argsort 常见踩坑点
容易出错的地方往往不在函数本身,而在索引复用时的维度/类型错配:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
立即学习“Python免费学习笔记(深入)”;
- 如果
a是浮点数组且含nan,np.argsort默认把nan放最后;要统一前置,得先用np.nan_to_num或显式掩码 - 对字符串数组使用
np.argsort没问题,但注意 Unicode 排序规则(如大小写敏感),必要时先.lower()转换 - 返回索引是 1D 的,即使输入是 2D;若想获得每行/列的独立排序索引,必须设
axis,否则会拉平处理 - 别把
np.argsort和np.argmin/np.argmax混用 —— 后者只返回一个标量索引
实际映射场景:用排序索引对多个字段联动重排
比如你有一组坐标 x, y 和对应标签 label,想按 x 升序重排所有字段:
idx = np.argsort(x) x_sorted = x[idx] y_sorted = y[idx] label_sorted = label[idx]
只要 x, y, label 长度相同,这样操作就完全解耦 —— 原始变量一个没动,新变量全是视图或副本(取决于是否原地修改)。如果后续还要反查「排序后第 i 个元素在原数组中是第几个」,直接用 idx[i] 就行;反过来,要知道原数组第 j 个元素排第几,得用 np.where(idx == j)[0][0](注意 np.where 返回元组)。
最易被忽略的是:np.argsort 对重复值的处理是稳定但不显式标注的 —— 相同值的相对顺序保持不变,但如果你依赖这个稳定性做业务逻辑,最好加一句注释,因为不是所有排序算法都默认稳定(虽然 NumPy 的是)。

















