在Python数组中查找已排序元素的索引

时间:2013-12-18 21:29:05

标签: python arrays sorting numpy

我已经看到了问题的答案:
是否可以通过按降序使用元素的索引来排列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] 

我意识到我可以从第一个例子中得到答案,然后使用它来得到我想要的东西(稍微有点狡猾)但是有一个捷径吗?

效率不是问题。我只需要一些能给我答案的东西。

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吗?如果是,请使用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