Je suis surpris que cette question spécifique n'ait pas été posée auparavant, mais je ne l'ai vraiment pas 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 trie, j'obtiens 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 trié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 bien le cas, existe-t-il une alternative efficace? Il ne semble pas que les np.sort
paramètres acceptent pour changer le signe des comparaisons dans l'opération de tri pour obtenir les choses dans l'ordre inverse.
temp[::-1].sort()
sait-il qu'il doit trier dans l'ordre inverse ?? La façon dont je le lis est: inversez le tableau d'origine, puis triez-le (par ordre croissant). Pourquoi l'inversion du tableau d'origine (dans un ordre aléatoire) et le tri par ordre croissant renverrait-il le tableau dans l'ordre inverse?[::-1]
dit simplement numpy d'itérer sur le tableau à l'envers, plutôt que de réorganiser le tableau. Ainsi, lorsque le tri sur place se produit, il trie en fait dans l'ordre croissant et déplace les bits, mais laisse la partie de l'itération arrière intacte.a=np.array((...))
l'idiomea[::-1]
n'inverse rien, c'est juste une nouvelle vue sur les mêmes données, plus précisément une vue miroir. Le procédéa[::-1].sort()
opère sur l'image en miroir , ce qui implique que lorsquesort
se déplace vers la gauche un élément plus petit dans son image en miroir, il le déplace en réalité vers la droite dans le bloc de mémoire réel dua
tableau. La vue en miroir est triée par ordre croissant, les données réelles sont triées par ordre décroissant. Essayez-le chez vous seul, avec des pièces de monnaie différentes et un miroir!np.sort(temp,order='descending')
plutôt que d'exiger ce genre de hacksla source
axis
qui anp.sort
été appliqué n'est nécessaire.np.sort(temp)[::-1]
du fait qu'il placenan
s à l'arrière du tableau au lieu de l'avant. Que ce soit bon ou mauvais est à débattre ..Pour les tableaux courts, je suggère d'utiliser
np.argsort()
en recherchant les indices du tableau trié négatif, ce qui est légèrement plus rapide que l'inversion du tableau trié:la source
a[np.argsort(-a)]
est probablement la meilleure approche par rapport aux autres sur cette page. Pas d'inversion de pas -1 et un signe moins de moins à penser.Malheureusement, lorsque vous avez un tableau complexe, cela ne
np.sort(temp)[::-1]
fonctionne que correctement. Les deux autres méthodes mentionnées ici ne sont pas efficaces.la source
Soyez prudent avec les dimensions.
Laisser
Retour complet
flip
modifié dans1.15
, versions précédentes requises . Solution: .1.14
axis
pip install --upgrade numpy
Première dimension inversée
Deuxième dimension inversée
Essai
Test sur une matrice 100 × 10 × 10 1000 fois.
Cela est principalement dû à la réindexation plutôt qu'à
argsort
.la source
Bonjour, je cherchais une solution pour le tri inversé d'un tableau numpy à deux dimensions, et je n'ai rien trouvé qui fonctionnait, mais je pense que je suis tombé sur une solution que je télécharge juste au cas où quelqu'un serait dans le même bateau.
np.sort trie par ordre croissant, ce qui n'est pas ce que vous voulez, mais la commande fliplr retourne les lignes de gauche à droite! Semble fonctionner!
J'espère que cela vous aidera!
Je suppose que c'est similaire à la suggestion de -np.sort (-a) ci-dessus, mais j'ai été découragé par le commentaire que cela ne fonctionne pas toujours. Peut-être que ma solution ne fonctionnera pas toujours non plus, mais je l'ai testée avec quelques tableaux et semble être OK.
la source
Vous pouvez d'abord trier le tableau (Croissant par défaut), puis appliquer np.flip () ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html )
FYI Cela fonctionne également avec les objets datetime.
Exemple:
la source
x = np.array([2,3,np.nan,1,0])
alors l'np.flip(np.sort(x))
approche donne [nan 3. 2. 1. 0.], tandis que l'-np.sort(-x)
approche donne [3. 2. 1. 0. nan].Voici un petit truc
la source
je suggère d'utiliser ceci ...
par exemple:
Puis votre resault:
la source
np.arange(20-0.5, 10-0.5, -0.5)
. Mais c'est une histoire différente et peut être, en raison de la mauvaise lisibilité, discutable. Un tableau d'entrée n'est pas trié du tout