2
votes

Comment trier une matrice sur une ligne - Python

Donc, avoir une matrice comme celle-ci:

[[0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 1. 3. 4. 4.]]

Comment puis-je la trier par la dernière ligne, pour que le contenu des colonnes reste le même comme ceci:

num_seq = 10
seq_len = 5
seq_width = 5

con = np.random.randint(0, seq_width,size=seq_len)

seq = np.zeros((seq_len, seq_width))

seq[np.arange(seq_len), con] = 1
seq[seq_len-1, np.arange(seq_width)] = con

out = np.sort(seq, axis=1)

En ce moment, je le fais comme ceci:

[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 1. 3. 4. 4.]]

Et j'obtiens une sortie qui ressemble à ceci:

[[0. 1. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[1. 0. 3. 4. 4.]]


1 commentaires

Je prendrais une copie de la dernière ligne et ferais une paire de valeurs avec leurs indices sous forme de tuples. Ensuite, triez par les valeurs et extrayez les indices et triez les colonnes restantes en utilisant cela comme base


4 Réponses :


2
votes

Vous pouvez le faire avec np.argsort () et quelques tranchants numpy. En utilisant votre exemple de tableau:

arr = np.array([[0, 1, 0, 0, 0],
                [1, 0, 0, 0, 0],
                [0, 0, 0, 1, 0],
                [0, 0, 0, 0, 1],
                [1, 0, 3, 4, 4]])
arr[:, np.argsort(arr[-1, :])]
# array([[1, 0, 0, 0, 0],
#        [0, 1, 0, 0, 0],
#        [0, 0, 0, 1, 0],
#        [0, 0, 0, 0, 1],
#        [0, 1, 3, 4, 4]])

En gros, le np.argsort (arr [-1,:]) renvoie les indices du dernier ligne de arr dans l'ordre de la valeur croissante du contenu de cette dernière ligne. Cela renvoie array ([1, 0, 2, 3, 4]) pour l'exemple que vous avez donné.

Ensuite, nous saisissons simplement toutes les lignes avec les colonnes dans cet ordre avec arr [:, np.argsort (arr [-1,:])] .


0 commentaires

0
votes

Essayez: arr [:, arr [-1,:]. argsort ()]


0 commentaires

0
votes

Cela fait ce dont vous avez besoin, bien que l'approche numpy soit plus propre et meilleure, à mon avis. Cela dépend si votre matrice est vraiment une matrice, un tableau ou une liste de listes. Si vous ne pouvez pas utiliser numpy pour une raison quelconque, alors cette solution devrait fonctionner indépendamment, même si elle est un peu piratée.

your_matrix = [[0, 1., 0., 0., 0.],
                   [1., 0., 0., 0., 0.],
                   [0., 0., 0., 1., 0.,],
                   [0., 0., 0., 0., 1.],
                   [1., 0., 3., 4., 4.]]

your_last_row = your_matrix[-1]
#add indices
reference_row = [(idx, value) for (idx, value) in enumerate(your_last_row)]
ref_row_sorted = sorted(reference_row, key=lambda x: x[1])

#extract indices
indices = [x[0] for x in ref_row_sorted]

new_matrix = []
for row in your_matrix:
    new_row = [row[x] for x in indices]
    new_matrix.append(new_row)


0 commentaires

0
votes

Utilisation d'argsort pour sélectionner con comme index:

import numpy as np

num_seq = 10
seq_len = 5
seq_width = 5

con = np.random.randint(0, seq_width,size=seq_len)

seq = np.zeros((seq_len, seq_width))

seq[np.arange(seq_len), con] = 1
seq[seq_len-1, np.arange(seq_width)] = con


i = np.argsort(con)
seq = seq[:,i]

print(con)
print(seq)


0 commentaires