首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >高效查找Python数组/列表中N个最大元素的索引

高效查找Python数组/列表中N个最大元素的索引
EN

Stack Overflow用户
提问于 2012-10-09 02:48:34
回答 4查看 19.8K关注 0票数 22

如果这是一个重复的问题,我很抱歉,我寻找了这个信息,但仍然没有找到它。

是否可以非常有效地使用N个最大元素的索引来排列numpy数组(或python列表)?

例如,数组:

代码语言:javascript
复制
a = array([4, 1, 0, 8, 5, 2])

按降序排列的最大元素的索引将给出(考虑N= 6,包括所有元素):

8 --> 3

5 --> 4

4 --> 0

2 --> 5

1 --> 1

0 --> 2

代码语言:javascript
复制
result = [3, 4, 0, 5, 1, 2]

我知道如何使用一种有点愚蠢的方法(比如对数组排序并搜索N个数字中的每一个作为索引),但我想知道是否有像瓶颈或heapq这样的高效库或pythonic方法来使这一过程变得非常快。我必须将它应用到几个数组中,每个数组有300k个元素,所以这就是为什么性能是个问题。

提前感谢!

更新

我读了答案,并决定使用300k随机整数对它们进行计时,结果如下:

解决方案1: sorted(range(len(a)), key=lambda i:a[i]) 时间: 230毫秒

解决方案2: heapq.nlargest(len(a), zip(a, itertools.count())) 时间: 396毫秒

解决方案3: heapq.nlargest(len(a), enumerate(a), key=operator.itemgetter(1)) 时间: 864毫秒

解决方案4: def f(a,N): return np.argsort(a)[::-1][:N] (N = len(a)) 时间: 104毫秒

非常感谢你的快速和非常好的答案!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-09 02:58:31

您看过内置的numpy argsort方法吗?:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html

使用这种方法,我可以在我的机器上用大约29毫秒的时间对包含300,000个随机浮点数的数组进行排序。

代码语言:javascript
复制
def f(a,N):
    return np.argsort(a)[::-1][:N]
票数 21
EN

Stack Overflow用户

发布于 2012-10-09 02:52:38

代码语言:javascript
复制
L = [4, 1, 0, 8, 5, 2]
sorted(range(len(L)), key=lambda i:L[i])
票数 11
EN

Stack Overflow用户

发布于 2012-10-09 02:52:58

您可以使用heapq很容易地做到这一点:

代码语言:javascript
复制
>>> heapq.nlargest(3, zip(a, itertools.count()))
[(8, 3), (5, 4), (4, 5)]

元组按第一个值排序,然后按第二个值排序,依此类推。这意味着我们可以简单地创建一个(value, index)和排序的元组,给出这些值的索引(值也是给出的,但是我们可以很容易地丢弃它们)。

我使用zip()itertools.count(),因为枚举给了我们错误的顺序,所以它们将按索引排序,而不是按值排序。或者,你也可以做((value, index) for index, value in enumerate(a)),但我觉得这不太清楚。

另一种选择是给出一个键,执行heapq.nlargest(3, enumerate(a), key=operator.itemgetter(1))

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12787650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档