Python Matrice de tri via une colonne
J'ai un n x 2 matrice d'entiers. La première colonne est une série 0,1,-1,2,-2, mais ces derniers sont dans l'ordre qu'ils ont été compilés à partir de leurs constituants des matrices. La deuxième colonne est une liste d'indices à partir d'une autre liste.
Je voudrais trier la matrice par l'intermédiaire de ce deuxième colonne. Ce serait l'équivalent de la sélection de deux colonnes de données dans Excel, et le tri par Colonne B (où les données sont dans les colonnes A et B). Gardez à l'esprit, le centre de données dans la première colonne de chaque ligne doit être conservé avec son deuxième colonne de contrepartie. J'ai regardé les solutions utilisant les éléments suivants:
data[np.argsort(data[:, 0])]
Mais cela ne semble pas fonctionner. La matrice en question ressemble à ceci:
matrix([[1, 1],
[1, 3],
[1, 7],
...,
[2, 1021],
[2, 1040],
[2, 1052]])
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser np.lexsort:
Remarque si vous passez plus d'une touche à
np.lexsort
, le dernier clé est la clé primaire. La prochaine à la dernière clé est la deuxième clé, et ainsi de suite.À l'aide de
np.lexsort
que je montre ci-dessus nécessite l'utilisation d'un tableau temporaire, carnp.lexsort
ne fonctionne pas sur numpy matrices. Depuistemp = data.view(np.ndarray)
crée une vue, plutôt qu'une copie dedata
, il ne nécessite pas beaucoup de mémoire supplémentaire. Cependant,est un nouveau tableau, qui ne nécessitent plus de mémoire.
Il est aussi un moyen de trier par colonnes en place. L'idée est d'afficher le tableau comme une structure du tableau avec deux colonnes. Contrairement à la plaine ndarrays, structuré tableaux ont un
sort
méthode qui permet de spécifier les colonnes clés:Remarque que depuis
temp2
est un vue dedata
, il ne nécessite pas l'attribution de nouvelles de la mémoire et de la copie de la matrice. Aussi, le tritemp2
modifiedata
en même temps:Vous avez eu la bonne idée, juste à côté de quelques personnages: