Trier efficacement un tableau numpy en ordre décroissant?

Je suis surpris que cette question spécifique n’ait pas été posée auparavant, mais je ne l’ai pas vraiment trouvée sur SO ni sur la documentation de np.sort .

Disons que j’ai un tableau numpy aléatoire contenant des entiers, par exemple:

 > temp = np.random.randint(1,10, 10) > temp array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4]) 

Si je le sortinge, je reçois un ordre croissant par défaut:

 > np.sort(temp) array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7]) 

mais je veux que la solution soit sortingée par ordre décroissant .

Maintenant, je sais que je peux toujours faire:

 reverse_order = np.sort(temp)[::-1] 

mais cette dernière déclaration est-elle efficace ? Ne crée-t-il pas une copie dans l’ordre croissant, puis inverse cette copie pour obtenir le résultat dans l’ordre inverse? Si tel est le cas, existe-t-il une alternative efficace? Il ne semble pas que np.sort accepte les parameters pour changer le signe des comparaisons dans l’opération de sorting afin d’obtenir l’ordre inverse.

temp[::-1].sort() sortinge le tableau en place, np.sort(temp)[::-1] crée un nouveau tableau.

 In [25]: temp = np.random.randint(1,10, 10) In [26]: temp Out[26]: array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4]) In [27]: id(temp) Out[27]: 139962713524944 In [28]: temp[::-1].sort() In [29]: temp Out[29]: array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2]) In [30]: id(temp) Out[30]: 139962713524944 
 >>> a=np.array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4]) >>> np.sort(a) array([2, 2, 4, 4, 4, 4, 5, 6, 7, 8]) >>> -np.sort(-a) array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2]) 

Pour les tableaux courts, je suggère d’utiliser np.argsort() en recherchant les indices du tableau négatif sortingé, ce qui est légèrement plus rapide que d’inverser le tableau sortingé:

 In [37]: temp = np.random.randint(1,10, 10) In [38]: %timeit np.sort(temp)[::-1] 100000 loops, best of 3: 4.65 µs per loop In [39]: %timeit temp[np.argsort(-temp)] 100000 loops, best of 3: 3.91 µs per loop 

Malheureusement, lorsque vous avez un tableau complexe, seul np.sort(temp)[::-1] fonctionne correctement. Les deux autres méthodes mentionnées ici ne sont pas efficaces.