列表中最大n个元素的项目和索引

时间:2019-04-09 19:36:22

标签: python python-3.x list numpy sorting

我有一个数组:

arr = [23,34,2,55,5,13,44,3]

,我想用它们的索引保存n个最大的数字。
例如,对于n = 2,我想要

[(55,3), (44,6)]

我找不到简单的方法。 我只发现了如何使用nlargest获取n个最大项或如何使用argpartition获取n个最大索引。

3 个答案:

答案 0 :(得分:2)

免责声明:不是 numpy解决方案-您可以结合使用enumeratesorted,生成器理解和列表切片:

n = 3
s = list(sorted( ((v,i) for i,v in enumerate([23,34,2,55,5,13,44,3]) ),reverse = True))[:n]

print(s)

输出:

 [(55, 3), (44, 6), (34, 1)]

Doku:

生成器用于翻转由枚举产生的索引和值,切片会减少结果量。

答案 1 :(得分:2)

这是基于NumPy的解决方案:

In [207]: arr
Out[207]: array([23, 34,  2, 55,  5, 13, 44,  3])

# sort array `arr` in increasing order
In [208]: arr_sorted = arr[arr.argsort()]

# slice largest 3 elements
In [209]: largest_3 = arr_sorted[-3:][::-1]

In [210]: largest_3
Out[210]: array([55, 44, 34])

# get the indices that would sort the array `arr` (in increasing order)
In [211]: arr_sorted_idx = arr.argsort()

# grab the largest 3 indices in accordance with [209]/[210]
In [212]: largest_3_idx = arr_sorted_idx[-3:][::-1]

In [213]: largest_3_idx
Out[213]: array([3, 6, 1])

largest_3_idx是原始数组arr中最大3个元素的索引。


如果根本需要将结果作为元组列表,则使用:

In [214]: list(zip(largest_3.tolist(), largest_3_idx.tolist()))
Out[214]: [(55, 3), (44, 6), (34, 1)]

答案 2 :(得分:2)

这是一个简短的Numpy版本:

n=3 #number of largest elements to get
a = np.array([23, 34,  2, 55,  5, 13, 44,  3])
idx = a.argsort()[:-n-1:-1] #Use argsort get sorted index and slice backwards
list(zip(a[idx], idx)) #zip and list for tuples

输出:

[(55, 3), (44, 6), (34, 1)]

让我们绘制一些时间点:

import numpy
import perfplot

def sb_numpy(a,n):
    idx = a.argsort()[:-n-1:-1] #Use argsort get sorted index and slice backwards
    return list(zip(a[idx], idx))

def pa_pyth(a,n):
    return list(sorted( ((v,i) for i,v in enumerate(a) ),reverse = True))[:n]


perfplot.show(
    setup=lambda n: numpy.random.randint(0,10e7, n),
    kernels=[
        lambda a: sb_numpy(a,3),
        lambda a: pa_pyth(a,3)
        ],
    labels=['sb_numpy', 'pa_pyth'],
    n_range=[2**k for k in range(15)],
    xlabel='N'
    )

输出:

enter image description here