You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Numpy argsort的逆操作?获取浮点数组元素排序后的位置索引

解决Numpy中获取原数组元素在排序后数组位置的问题

这问题我之前折腾过好一会儿!其实你要的是逆argsort的操作,只需要对argsort的结果再调用一次argsort就能完美解决,咱们结合你的例子一步步说:

首先先明确需求差异:

  • 你给出的例子里,原数组 x = np.array([3, 1, 2])
  • np.argsort(x) 返回的 array([1, 2, 0]),它的含义是:排序后的数组里,第i个元素来自原数组的第几个索引(比如排序后第0位是原数组索引1的元素1,第1位是原数组索引2的元素2)
  • 而你需要的 array([2, 0, 1]),含义是:原数组里第i个元素,在排序后的数组中处于哪个索引位置(原数组索引0的3在排序后是第2位,索引1的1在第0位)

实现代码

直接对argsort的结果再执行一次argsort即可:

import numpy as np

x = np.array([3, 1, 2])
# 先获取常规argsort结果
sorted_indices = np.argsort(x)
# 对这个结果再argsort,得到我们需要的位置数组
target_indices = np.argsort(sorted_indices)

print(target_indices)  # 输出: array([2, 0, 1])

为什么这招管用?

咱们拆解一下:

  1. sorted_indices = [1, 2, 0],这个数组的元素是原数组的索引,按排序后数组的顺序排列
  2. 对它执行argsort,其实是在找:sorted_indices中每个元素的排名位置。比如:
    • sorted_indices里最小的元素是0,它在sorted_indices的索引是2 → 对应原数组索引0的元素,在排序后数组的位置是2
    • 第二小的元素是1,它在sorted_indices的索引是0 → 对应原数组索引1的元素,在排序后数组的位置是0
    • 最大的元素是2,它在sorted_indices的索引是1 → 对应原数组索引2的元素,在排序后数组的位置是1
      刚好完全匹配你想要的结果!

测试重复元素的情况

如果数组里有重复值,这个方法也能正确处理:

x = np.array([2, 1, 1, 3])
sorted_indices = np.argsort(x)  # 输出: array([1, 2, 0, 3])
target_indices = np.argsort(sorted_indices)  # 输出: array([2, 0, 1, 3])

这个结果对应:原数组的2在排序后数组的第2位,两个1分别在第0和第1位,3在第3位,完全符合预期。

内容的提问来源于stack exchange,提问作者Qise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 14:12:31