如何在列表或np.array中找到n个最大元素的索引,Python

24

有没有内置函数或者非常简单的方法来查找列表或numpy数组中n个最大元素的索引?

K = [1,2,2,4,5,5,6,10]

找到最大5个元素的索引?

我会将重复的元素计算多次,并输出这些最大数字的索引列表。


你在这里期望的输出是什么? - Ashwini Chaudhary
2
你是否重复计算了重复项? - Colleen
2
可能是如何在numpy数组中获取N个最大值的索引?的重复问题。 - John Zwinck
1
那么针对 [1,2,2,4,5,10,5,6,10],输出会是什么? - Ashwini Chaudhary
5个回答

44

也许可以是这样的:

>>> 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]

或者使用 numpy,你可以使用 argsort

>>> np.argsort(K)[-5:]
array([0, 1, 5, 3, 7])

argsort也是一个方法:

>>> K = np.array(K)
>>> K.argsort()[-5:]
array([0, 1, 5, 3, 7])
>>> K[K.argsort()[-5:]]
array([ 4,  5,  5,  6, 10])

3
另外一种方法是 import heapq;heapq.nlargest(n, range(len(K)), key=lambda x: K[x]) - Makers_F
这种方法不太适合对于非常大的列表进行排序,因为它可能需要O(n^2)的时间复杂度,而你应该在线性时间内解决这个问题。 - L.DZ

4
考虑以下代码:
 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])

如果您希望忽略重复项,则可以使用set()函数,如下所示:
 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])

希望其中一个可以回答您的问题 :)

1
这应该可以工作:
K = [1,2,2,4,5,5,6,10]
num = 5
print 'K %s.' % (sorted(K, reverse=True)[:num])

这会给出值本身,但不包括它们的索引。 - ClimateUnboxed

1
为了提高效率,对于大数组而言,NumPy的Partition函数会更加高效。它并不需要完全排序。
“所有小于第k个元素的元素都会被移动到此元素前面,而所有等于或大于第k个元素的元素则会被移动到其后面。这两个分区中的元素顺序是不确定的。”

我正要把这个作为答案添加进来。我认为 @cosine 的意思是使用 np.argpartition 而不是像在 @DSM 的回答中使用 np.argsort。因此,np.argpartition(K,-5)[-5:] 返回前五个最大值的 索引,即 [3, 4, 5, 6, 7]。使用这些索引在 K 上,np.array(K)[ np.argpartition(K,-5)[-5:] ] 返回实际的五个最大值,即 [ 4, 5, 5, 6, 10] (你也可以直接使用 np.partition(K,-5)[-5:] 获取这些值)。 - gnoodle

0

import headq

然后使用函数nlargest()


1
亲爱的JimmyC,你是对的,这是在Python中完成它的最佳方式。然而,你的答案收到了负评。我想这是因为有几种方法可以改进你的答案:(1)你写成了headq而不是heapq。(2)请用完整的英语句子书写。(3)请给出一个使用示例。(4)你还可以链接到文档:https://docs.python.org/3/library/heapq.html#heapq.nlargest - Stef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接