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 .
3 Réponses :
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.
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])
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:
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!