如何实现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])
为什么这招管用?
咱们拆解一下:
sorted_indices = [1, 2, 0],这个数组的元素是原数组的索引,按排序后数组的顺序排列- 对它执行
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
相关产品推荐
相关产品推荐

