Как отсортировать матрицу по одной строке - Python - PullRequest
0 голосов
/ 31 января 2019

Имея такую ​​матрицу:

[[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. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 1. 3. 4. 4.]]

Прямо сейчас я делаю это так:

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)

И получаю вывод, который выглядит так:

[[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.]]

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

Использование argsort для выбора con в качестве индекса:

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 голосов
/ 31 января 2019

Попробуйте: arr[:, arr[-1, :].argsort()]

0 голосов
/ 31 января 2019

Это делает то, что вам нужно, хотя на мой взгляд, грубый подход чище и лучше.Это зависит от того, является ли ваша матрица действительно матрицей, массивом или списком списков.Если вы не можете использовать numpy по какой-либо причине, тогда это решение должно работать независимо, даже если оно немного хакерское.

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 голосов
/ 31 января 2019

Вы можете сделать это с np.argsort() и небольшим кусочком.Используя ваш пример массива:

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]])

В основном np.argsort(arr[-1, :]) возвращает индексы последней строки arr в порядке возрастания значения содержимого этого последнего ряда.Это возвращает array([1, 0, 2, 3, 4]) для приведенного вами примера.

Затем мы просто берем все строки со столбцами в указанном порядке с помощью arr[:, np.argsort(arr[-1, :])].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...