Le tri dans les tableaux NumPy par colonne
Comment trier un tableau NumPy par la n-ième colonne?
Par exemple,
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
Je voudrais trier les lignes par la deuxième colonne, telle que je serai de retour:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
- C'est vraiment un mauvais exemple puisque
np.sort(a, axis=0)
serait une solution satisfaisante pour la matrice donnée. J'ai proposé une modification avec un meilleur exemple, mais a été rejetée, même si effectivement, la question serait beaucoup plus clair. L'exemple doit être quelque chose commea = numpy.array([[1, 2, 3], [6, 5, 2], [3, 1, 1]])
avec la sortie souhaitéearray([[3, 1, 1], [1, 2, 3], [6, 5, 2]])
- David, vous n'avez pas obtenir le point de la question. Il veut maintenir l'ordre au sein de chaque ligne de la même.
Vous devez vous connecter pour publier un commentaire.
@steves'est en fait la façon la plus élégante de le faire.
Pour la "bonne" façon de voir l'ordre argument mot-clé de numpy.ndarray.tri
Cependant, vous devez accéder à votre tableau comme un tableau avec des champs (un tableau structuré).
La "bonne" façon est assez laid si vous n'avez pas d'abord définir votre tableau avec des champs...
Comme un exemple rapide, de les trier et de renvoyer une copie:
De faire le tri sur place:
@Steve est vraiment la façon la plus élégante de le faire, autant que je sache...
Le seul avantage de cette méthode est que la "commande" de l'argument est une liste de champs à l'ordre de la recherche. Par exemple, vous pouvez trier les résultats par la deuxième colonne, puis la troisième colonne, puis la première colonne par la fourniture d'une commande=['f1','f2','f0'].
ValueError: new type not compatible with array.
float
? Dois-je changer quelque chose?a
avant d'arriver à ce point dans le code, vous aurez besoin de prendre une copie intégrale de manière à obtenir le bon sens de laview
méthode. Voir cette quension.a.dtype.str
pour obtenir le'i8'
ou'f8'
chaîne...qui vous puis besoin de construire dans la chaîne délimitée par des virgules.a = np.array([['a',1,2,3],['b',4,5,6],['c',0,0,1]])
quelle démarche dois-je suivre?pandas
. Cela simplifiera beaucoup du type d'opération que vous souhaitez effectuer.np.argsort
peuvent eux-mêmes prendre beaucoup de mémoire, et en plus de cela, l'indexation avec un tableau permettra également de générer une copie du tableau qui est en cours de tri.np.nan_to_num(a)
à corriger.array.flags.c_contiguous
est vrai, c'est que la garantie que le point de vue méthode de travail?Je suppose que cela fonctionne:
a[a[:,1].argsort()]
Cela indique la deuxième colonne de
a
et de tri sur la base en conséquence.1
ici? l'indice triées par?[:,1]
indique la deuxième colonne dea
.a[a[:,1].argsort()[::-1]]
np.sort
ou pas?ind = np.argsort( a[:,1] ); a = a[ind]
a = array([[1,6,2],[5,3,7]]) print(a) c = a[0,:].argsort() print(c) d = a[:,c] print(d) c = a[:,1].argsort() print(c) e = a[c,:] print(e)
cols
, c'est à dire toutes les colonnes. Pour ce cas, je nea[np.lexsort(a.T[cols])]
où[cols]
pourrait être laissé de côté si triés par toutes les colonnes et de droite à gauche. Cela permet aussi de définir l'ordre des colonnes pour trier, j'.ecols = range(a.shape[1])[::-1]
.Vous pouvez trier sur plusieurs colonnes comme par Steve Tjoa de la méthode en utilisant un tri stable comme mergesort et de trier les indices de la moins importante à la plus importante des colonnes:
Ce tris par colonne 0, puis 1, puis 2.
De le wiki de documentation de Python, je pense que vous pouvez faire:
La sortie est:
Au cas où quelqu'un veut faire usage de tri à un moment critique de leurs programmes voici une comparaison des performances pour les différentes propositions:
Ainsi, il ressemble à de l'indexation avec argsort est la méthode la plus rapide pour l'instant...
De le NumPy liste de diffusion, voici une autre solution:
a[np.lexsort(a.T[cols])]
. oùcols=[1]
dans la question d'origine.J'ai eu un problème similaire.
Mon Problème:
Je veux calculer un SVD et le besoin de faire le tri dans mes les valeurs propres dans l'ordre décroissant. Mais je veux garder la correspondance entre les valeurs propres et vecteurs propres.
Mes valeurs propres étaient dans la première rangée et le vecteur propre correspondant ci-dessous dans la même colonne.
Si je veux trier un tableau à deux dimensions de la colonne de sage par la première rangée, dans l'ordre décroissant.
Ma Solution
Alors, comment cela fonctionne?
a[0,]
est juste la première ligne, je veux trier par.Maintenant, j'utilise argsort pour obtenir l'ordre des indices.
- Je utiliser
[::-1]
parce que j'ai besoin l'ordre décroissant.Enfin je utiliser
a[::, ...]
pour obtenir une vue avec les colonnes dans le bon ordre.Un peu plus compliqué
lexsort
exemple - en descendant sur la 1ère colonne, secondairement ascendant sur le 2e. Les trucs aveclexsort
sont sortes sur des lignes (d'où le.T
), et donne la priorité à la dernière.Voici une autre solution compte tenu de tous colonnes (façon plus compacte de J. J's réponse);
De tri avec lexsort,
De sortie: