web-dev-qa-db-fra.com

Le moyen le plus rapide de trouver la nième plus grande valeur d'une matrice numpy

Il existe de nombreuses solutions pour ce faire pour un seul tableau, mais qu'en est-il d'une matrice, telle que:

>>> k
array([[ 35,  48,  63],
       [ 60,  77,  96],
       [ 91, 112, 135]])

Vous pouvez utiliser k.max(), mais bien sûr, cela ne renvoie que la valeur la plus élevée, 135. Et si je veux le deuxième ou le troisième?

12
thefoxrocks

Vous pouvez aplatir la matrice puis la trier:

>>> k = np.array([[ 35,  48,  63],
...        [ 60,  77,  96],
...        [ 91, 112, 135]])
>>> flat=k.flatten()
>>> flat.sort()
>>> flat
array([ 35,  48,  60,  63,  77,  91,  96, 112, 135])
>>> flat[-2]
112
>>> flat[-3]
96
9
rofls

Comme dit , np.partition devrait être plus rapide (au plus O(n) temps d'exécution):

np.partition(k.flatten(), -2)[-2]

devrait renvoyer le 2e plus grand élément. (partition garantit que l'élément numéroté est en position, tous les éléments précédents sont plus petits et tous ceux situés derrière sont plus grands).

19
serv-inc

Une autre façon de faire cela lorsque des éléments répétés sont présentés dans le tableau à disposition . Si nous avons quelque chose comme 

a = np.array([[1,1],[3,4]])

alors le deuxième plus grand élément sera 3, pas 1.

Vous pouvez également utiliser l'extrait suivant:

second_largest = sorted(list(set(a.flatten().tolist())))[-2]

D'abord, aplatissez la matrice, puis ne laissez que des éléments uniques, puis revenez à la liste des éléments mutables, triez-la et prenez le deuxième élément. Cela devrait renvoyer le deuxième plus gros élément de la fin, même s'il y a des éléments répétitifs dans le tableau.

0
drsealks
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
a=a.reshape((a.shape[0])*(a.shape[1]))  # n is the nth largest taken by us
print(a[np.argsort()[-n]])
0
Lakshay Chawla