【发布时间】:2012-09-29 01:17:03
【问题描述】:
如果这是一个重复的问题,我很抱歉,我查找了此信息但仍然找不到。
是否可以通过使用N个最大元素的索引以降序非常有效地排列一个numpy数组(或python列表)?
比如数组:
a = array([4, 1, 0, 8, 5, 2])
按降序排列的最大元素的索引将给出(考虑到 N = 6,包括所有元素):
8 --> 3
5 --> 4
4 --> 0
2 --> 5
1 --> 1
0 --> 2
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 毫秒
非常感谢您提供快速且非常好的答案!
【问题讨论】:
-
如果你跟踪重复的踪迹,this answer 会弹出,这似乎很有希望——尽管该帖子是由开发人员发布的,但答案并未透露这一事实......
-
在您的测试中, N 的值是多少?如上所述,使用 heapq 是有效的,因为 N 与 len(a) 相比相当小。
-
你如何为
N < len(a)修改这些? -
我同意@lizzie。您能否在实验中提供
N和len(a)的值?如果N比len(a)小很多,我认为heapq.nlargest应该比np.argsort更有效。
标签: python performance numpy