如果这是一个重复的问题,我很抱歉,我寻找了这个信息,但仍然没有找到它。
是否可以非常有效地使用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毫秒
非常感谢你的快速和非常好的答案!
发布于 2012-10-09 02:58:31
您看过内置的numpy argsort
方法吗?:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html
使用这种方法,我可以在我的机器上用大约29毫秒的时间对包含300,000个随机浮点数的数组进行排序。
def f(a,N):
return np.argsort(a)[::-1][:N]
发布于 2012-10-09 02:52:38
L = [4, 1, 0, 8, 5, 2]
sorted(range(len(L)), key=lambda i:L[i])
发布于 2012-10-09 02:52:58
您可以使用heapq
很容易地做到这一点:
>>> 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))
。
https://stackoverflow.com/questions/12787650
复制相似问题