2
votes

Articles et index des n plus grands éléments d'une liste

J'ai un tableau:

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

et je veux enregistrer les n plus grands nombres avec leurs index.
par exemple, pour n = 2, je veux

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

Je n'ai pas trouvé de moyen facile de le faire. Je n'ai trouvé que comment obtenir les n éléments les plus importants en utilisant nlargest ou les n plus grands index en utilisant argpartition .


0 commentaires

3 Réponses :


3
votes

Clause de non-responsabilité: pas une solution numpy - vous pouvez combiner énumérer , trié , compréhension du générateur et découpage de liste:

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

Le générateur est utilisé pour inverser l'index et la valeur produite par enumerate, le découpage réduit la quantité de résultats.


0 commentaires

2
votes

Voici une solution basée sur NumPy:

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

plus grand_3_idx sont les indices des 3 plus grands éléments du tableau d'origine arr .


Si vous avez besoin du résultat sous forme de liste de tuples, utilisez:

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


0 commentaires

2
votes

Voici une version courte de Numpy:

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'
    )

Sortie:

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

Tracons quelques timings:

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

Output:

 entrez la description de l'image ici


2 commentaires

J'aime l'idée zip, et peut-être que nous pouvons faire (-a) .argsort () [: 3]


J'aime ça aussi ... un argsort descendant. Merci @ Wen-Ben!