2013-08-31 6 views
2

У меня квадратная матрица NxN. Эта матрица часто довольно велика (N около 5000), и я хочу объединить части этой матрицы, чтобы сделать меньшую матрицу.Сортировка строк и столбцов матрицы другим списком с numpy

Следовательно, у меня есть список с N элементами, и эти элементы обозначают, какие строки/столбцы должны быть сгруппированы вместе в новой матрице.

Чтобы сделать алгоритм немного проще и быстрее, я хочу сортировать строки и столбцы на основе приведенного выше списка.

Пример:

Входной 5x5 матрица:

row/col | 1 | 2 | 3 | 4 | 5 | 
     1 | 5 | 4 | 3 | 2 | 1 | 
     2 | 10 | 9 | 8 | 7 | 6 | 
     3 | 15 | 14 | 13 | 12 | 11 | 
     4 | 20 | 19 | 18 | 17 | 16 | 
     5 | 25 | 24 | 23 | 22 | 21 | 

Для того, чтобы быть ясно: первая строка [5 4 3 2 1] и первый столбец [5, 10, 15, 20, 25].

список, содержащий «метка», которые обозначают, какие строки и столбцы должны быть сгруппированы вместе в новой матрице:

[2 2 1 3 3] 

Это означает, что новая матрица будет 3х3 (у нас есть 3 различных значений).

матрица с этикетками:

labels    2  1  3 
       --------- ---- --------- 
     row/col | 1 | 2 | 3 | 4 | 5 | 
    2 |  1 | 5 | 4 | 3 | 2 | 1 | 
    2 |  2 | 10 | 9 | 8 | 7 | 6 | 
    1 |  3 | 15 | 14 | 13 | 12 | 11 | 
    3 |  4 | 20 | 19 | 18 | 17 | 16 | 
    3 |  5 | 25 | 24 | 23 | 22 | 21 | 

Ожидаемая сортируется матрица:

row/col | 3 | 1 | 2 | 4 | 5 | 
     3 | 13 |15 | 14 | 12 | 11 | 
     1 | 3 | 5 | 4 | 2 | 1 | 
     2 | 8 |10 | 9 | 7 | 6 | 
     4 | 18 |20 | 19 | 17 | 16 | 
     5 | 23 |25 | 24 | 22 | 21 | 

И с этой матрицей можно легко подвести сгруппированных элементов для формирования нового элемента в матрице 3х3. Обратите внимание, что третий столбец и строка перемещены в начало/сверху, потому что оно имеет меньшее значение метки (1 против 2 и 3).

Вопрос: как сортировать матрицу таким образом с помощью numpy? Я искал другие вопросы и нашел lexsort, записывал массивы и другие вещи, но, как кто-то, у кого не было большого опыта работы с numpy, мне было трудно выполнить сортировку, которую я хотел.

Заранее благодарен!

ответ

4

numpy позволяет вам индексировать массив или список, таким образом изменяя порядок столбцов и строк легко.

Я думаю, что это то, что вы ищете:

>>> a = np.arange(25).reshape(5,5) 
>>> a 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 

    >>> a[[2,0,1,3,4]] [:,[2,0,1,3,4]] 
array([[12, 10, 11, 13, 14], 
     [ 2, 0, 1, 3, 4], 
     [ 7, 5, 6, 8, 9], 
     [17, 15, 16, 18, 19], 
     [22, 20, 21, 23, 24]]) 

В качестве побочного сведению:

Если вы хотите изменить порядок только строк:

>>> a[[2,0,1,3,4]] 
array([[10, 11, 12, 13, 14], 
     [ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 

Если вы хотел изменить порядок просто столбцов:

>>> a[:,[2,0,1,3,4]] 
array([[ 2, 0, 1, 3, 4], 
     [ 7, 5, 6, 8, 9], 
     [12, 10, 11, 13, 14], 
     [17, 15, 16, 18, 19], 
     [22, 20, 21, 23, 24]]) 
+0

А да, вместе с 'numpy.lexsort' У меня теперь есть решение, которое работает. Я использую lexsort для создания списка с индексами. –

Смежные вопросы