我已经看到了问题的答案:
是否可以通过按降序使用元素的索引来排列numpy数组(或python列表)?(例如Finding the Index of N biggest elements in Python Array / List Efficiently)
一个非常简洁的答案似乎是(来自上面的链接):
L = array([4, 1, 0, 8, 5, 2])
sorted(range(len(L)), key=lambda i:L[i])
这给出了已排序元素的位置(在原始数组中)。
8 - > 3
5 - > 4
4 - > 0
2 - > 5
1 - > 1
0 - > 2
所以答案是:
[3, 4, 0, 5, 1, 2]
我所追求的是元素的位置(在排序数组中):
L = array([4, 1, 0, 8, 5, 2])
8 - > 0
5 - > 1
4 - > 2
2 - > 3
1 - > 4
0 - > 5
所以我想:
[2, 4, 5, 0, 1, 3]
我意识到我可以从第一个例子中得到答案,然后使用它来得到我想要的东西(稍微有点狡猾)但是有一个捷径吗?
效率不是问题。我只需要一些能给我答案的东西。
答案 0 :(得分:3)
编辑首次阅读问题时,我认为您正在寻找numpy.argsort。
再次阅读,我意识到我误读了。
你正在寻找scipy.stats.rankdata(偏移1,反转)
(scipy.stats.rankdata([4, 1, 0, 8, 5, 2])-1)[::-1]
=> array([ 2., 4., 5., 0., 1., 3.])
(原始错误的答案,指的是argsort:)
from numpy import array, argsort
L = array([4, 1, 0, 8, 5, 2])
argsort(L)
=> array([2, 1, 5, 0, 4, 3])
答案 1 :(得分:0)
您可以简单地使用您的技术两次来获取排序列表中的索引:
A=[4, 1, 0, 8, 5, 2]
B=sorted(range(len(A)),key=lambda x:A[x],reverse=True)
C=sorted(range(len(A)),key=lambda x:B[x])
print C
打印
[2, 4, 5, 0, 1, 3]
这个想法是第一次迭代产生一个列表:
B = [3, 4, 0, 5, 1, 2]
在排序序列的原始列表中给出位置。
换句话说,A [3] = 8是原始列表中最大的元素,A [4] = 5是下一个最大的元素等。
然后第二阶段将B中的这些指数排序回0,1,2,3,4,5,并生成包含列表B中索引的C.
将B列表按降序排序可能会有所帮助,而C则将排序反转回原始的未排序顺序,同时跟踪排序列表中的索引。
答案 2 :(得分:-1)
numpy.argsort
import numpy as np
fakedata = np.array([40,20,60,50,10,20,80,30,50,40])
sorted_index = np.argsort(fakedata)
print(sorted_index)
print(fakedata[sorted_index])
[4 1 5 7 0 9 3 8 2 6] # sorted index
[10 20 20 30 40 40 50 50 60 80] # values selected by the sorted index