argsort返回的是排序后元素在原数组中的索引,而非排序后的值;需用a[np.argsort(a)]获取排序数组,多维时axis决定排序方向,稳定性需指定kind='stable',复合排序应使用lexsort。

argsort 返回的是索引,不是排序后的值
很多人一用 np.argsort 就直接拿结果当排序数组用,结果发现输出全是小整数——那是索引,不是数据本身。它干的事很明确:对输入数组升序排列,然后告诉你“原来排第0的元素现在该放在哪”,返回的是位置映射。
常见错误现象:np.argsort([3, 1, 4]) 返回 array([1, 0, 2]),不是 [1, 3, 4];有人误以为这是排序结果,后续直接参与计算就出错。
- 要用排序后数组?得配合花括号索引:
a[np.argsort(a)] - 要降序?加负号或用
[::-1]:a[np.argsort(-a)]或a[np.argsort(a)[::-1]] - 多维数组默认按最后一轴(列)排序,想按行排得显式写
axis=1
二维数组里 argsort 的 axis 参数决定“谁被排序”
np.argsort 在二维场景下最容易混淆:不指定 axis 时,它对每列单独算索引;设成 axis=0 是按列方向比较(即每列内排序),axis=1 是按行方向比较(即每行内排序)。这和 sort 行为一致,但新手常忽略 axis 导致索引错位。
使用场景:比如你有一批样本特征矩阵 X(shape=(1000, 5)),想对每个特征(每列)单独标准化顺序,就得用 axis=0;如果想对每个样本内部的 5 个维度排个序(比如找最大响应通道),就得用 axis=1。
立即学习“Python免费学习笔记(深入)”;
-
np.argsort(X, axis=0)→ 返回 shape 同 X 的索引数组,每列是该列的排序位置 -
np.argsort(X, axis=1)→ 每行独立排序,返回每行内各元素应放的位置 - 拿索引取原数组时注意广播:用
X[np.arange(X.shape[0])[:, None], idx]这类高级索引才能正确抓取
argsort 稳定性影响相同值的相对顺序
NumPy 默认的 argsort 是不稳定排序(quicksort),相同值的原始先后关系可能被打乱。如果你依赖“相等元素保持原有次序”,比如做分位数分组或构建稳定排名,就得显式指定 kind='stable'。
性能影响:稳定排序(如 timsort)比默认 quicksort 慢约 10%–30%,内存占用略高;但多数小数组无感,大数据集建议压测对比。
- 默认行为:
np.argsort([2, 1, 2])可能返回[1, 0, 2]或[1, 2, 0] - 强制稳定:
np.argsort([2, 1, 2], kind='stable')总返回[1, 0, 2](先出现的 2 在前) - 注意:'stable' 在 NumPy ≥1.15 可用,旧版本只能靠
lexsort模拟
argsort 和 lexsort 的分工边界在哪
np.argsort 只能按单个数组排序;遇到“先按 A 列升序、A 相同时再按 B 列降序”这类复合规则,就得换 np.lexsort。它接收一个元组或列表,把最后一个作为主键,倒着来——这点极易写反。
容易踩的坑:有人试图用两次 argsort 拼复合排序,结果逻辑错乱;或者把 lexsort((B, A)) 写成 (A, B),导致主次颠倒。
- 正确写法:
idx = np.lexsort((B, A))表示“主键是 A,次键是 B” - 要让次键降序?传
-B:np.lexsort((-B, A)) -
lexsort只支持一维序列,多维需先拉平或逐列提取


















