133 votes

Classer les éléments d’un tableau à l’aide de Python/NumPy, sans trier deux fois le tableau

J’ai un tableau de nombres et j’aimerais créer un autre tableau qui représente le rang de chaque élément dans le premier tableau. J’utilise Python et NumPy.

Par exemple:

Voici la meilleure méthode que j’ai trouvée:

Existe-t-il des méthodes meilleures/plus rapides qui évitent de trier le tableau deux fois ?

123voto

k.rooijers Points 171

Utilisez argsort deux fois, d’abord pour obtenir l’ordre du tableau, puis pour obtenir le classement :

Lorsque vous traitez avec des tableaux 2D (ou de dimension supérieure), veillez à passer un argument d’axe à argsort pour l’ordonner sur l’axe correct.

97voto

Sven Marnach Points 133943

Utilisez l’indexation avancée sur le côté gauche à la dernière étape :

Cela évite le tri deux fois en inversant la permutation dans la dernière étape.

6voto

Eelco Hoogendoorn Points 2218

Pour une version vectorisée d’un rang moyenné, voir ci-dessous. J’adore np.unique, il élargit vraiment la portée de ce que le code peut et ne peut pas être vectorisé efficacement. En plus d’éviter python for-loops, cette approche évite également la double boucle implicite sur 'a'.

5voto

Igor Fobia Points 68

J’ai essayé d’étendre les deux solutions pour les tableaux A de plus d’une dimension, en supposant que vous traitiez votre tableau ligne par ligne (axe = 1).

J’ai étendu le premier code avec une boucle sur les lignes; il peut probablement être amélioré

Et le second, suivant la suggestion de k.rooijers, devient:

J’ai généré aléatoirement 400 tableaux avec forme (1000 100); le premier code prenait environ 7,5, le second 3,8.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X