Reputation: 2594
Is there a built-in function or a very simple way of finding the index of n largest elements in a list or a numpy array?
K = [1,2,2,4,5,5,6,10]
Find the index of the largest 5 elements?
I count the duplicates more than once, and the output should be a list of the indices of those largest numbers
Upvotes: 26
Views: 46926
Reputation: 31
For efficiency, numpy partition is much more efficient for large array. There is no need to sort fully.
"All elements smaller than the k-th element are moved before this element and all equal or greater are moved behind it. The ordering of the elements in the two partitions is undefined."
Upvotes: 1
Reputation: 6865
Consider the following code,
N=5
K = [1,10,2,4,5,5,6,2]
#store list in tmp to retrieve index
tmp=list(K)
#sort list so that largest elements are on the far right
K.sort()
#To get the 5 largest elements
print K[-N:]
#To get the 5th largest element
print K[-N]
#get index of the 5th largest element
print tmp.index(K[-N])
If you wish to ignore duplicates, then use set() as follows,
N=5
K = [1,10,2,4,5,5,6,2]
#store list in tmp to retrieve index
tmp=list(K)
#sort list so that largest elements are on the far right
K.sort()
#Putting the list to a set removes duplicates
K=set(K)
#change K back to list since set does not support indexing
K=list(K)
#To get the 5 largest elements
print K[-N:]
#To get the 5th largest element
print K[-N]
#get index of the 5th largest element
print tmp.index(K[-N])
Hopefully one of them covers your question :)
Upvotes: 4
Reputation: 353489
Maybe something like:
>>> K
[4, 5, 1, 6, 2, 5, 2, 10]
>>> sorted(range(len(K)), key=lambda x: K[x])
[2, 4, 6, 0, 1, 5, 3, 7]
>>> sorted(range(len(K)), key=lambda x: K[x])[-5:]
[0, 1, 5, 3, 7]
or using numpy
, you can use argsort
:
>>> np.argsort(K)[-5:]
array([0, 1, 5, 3, 7])
argsort
is also a method:
>>> K = np.array(K)
>>> K.argsort()[-5:]
array([0, 1, 5, 3, 7])
>>> K[K.argsort()[-5:]]
array([ 4, 5, 5, 6, 10])
Upvotes: 45