Вопрос по python, matrix, numpy – Изменение порядка элементов матрицы с помощью Numpy

8

У меня есть матрица NumPy, которую я упростил для примера:

       a  b  c  d  e  f 
A =  [[0, 1, 2, 3, 4, 5],
 b    [1, 0, 3, 4, 5, 6],
 c    [2, 3, 0, 5, 6, 7],
 d    [3, 4, 5, 0, 7, 8],
 e    [4, 5, 6, 7, 0, 9],
 f    [5, 6, 7, 8, 9, 0]]

где число в «пересечениях»; важно, но их порядок не так. Я хочу переставить строки и столбцы так, чтобы новый порядок был [a, d, b, e, c, f], но это значение, которое я называю "пересечением". та же.

Ниже я начал трансформировать матрицу так, как хочу. Заполнение «е»; Строка включает в себя рассмотрение пересечений выше для (e, a) (= 4), затем (e, d) (= 7), затем (e, b) (= 5), (e, e), (e, c ) и (е, е)

       a  d  b  e  c  f
A1=  [[0, 3, 1, 4, 2, 5],
 d    [3, 0, 4, 7, 5, 8],
 b    [1, 4, 0, 5, 3, 6],  
 e    [4, 7, 5, 

Кто-нибудь может подсказать, пожалуйста, как переставить мою матрицу таким образом?

Это может помочь:stackoverflow.com/a/4857981/1142167 Joel Cornett

Ваш Ответ

2   ответа
1

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

12

edit: Я просто наткнулся на решение NumPy, которое используетрасширенная индексация:

#                 a  b  c  d  e  f
A = numpy.                 [1, 0, 3, 4, 5, 6],
                 [2, 3, 0, 5, 6, 7],
                 [3, 4, 5, 0, 7, 8],
                 [4, 5, 6, 7, 0, 9],
                 [5, 6, 7, 8, 9, 0]])

#            a  d  b  e  c  f
new_order = [0, 3, 1, 4, 2, 5]
A1 = A[:, new_order][new_order]

Вот чистое решение Python, которое может быть перенесено в NumPy:

#     a  b  c  d  e  f
A = [[0, 1, 2, 3, 4, 5],
     [1, 0, 3, 4, 5, 6],
     [2, 3, 0, 5, 6, 7],
     [3, 4, 5, 0, 7, 8],
     [4, 5, 6, 7, 0, 9],
     [5, 6, 7, 8, 9, 0]]

#            a  d  b  e  c  f
new_order = [0, 3, 1, 4, 2, 5]    # maps previous index to new index
A1 = [[A[i][j] for j in new_order] for i in new_order]

Результат:

>>> pprint.pprint(A1)
[[0, 3, 1, 4, 2, 5],
 [3, 0, 4, 7, 5, 8],
 [1, 4, 0, 5, 3, 6],
 [4, 7, 5, 0, 6, 9],
 [2, 5, 3, 6, 0, 7],
 [5, 8, 6, 9, 7, 0]]

Вот версия, которая изменяетA на месте:

A[:] = [A[i] for i in new_order]
for row in A:
    row[:] = [row[i] for i in new_order]
@wagras. Если вы не видите мою правку, я нашел более краткое решение для NumPy.
Вещь красоты. Это выполняет именно то, что я искал, и довольно компактно тоже. Я не понимаю "pprint.pprint", хотя. Кроме того, ваши комментарии сделали ответ еще проще для чтения. Как новичок, я ценю это. emmagras
Я наблюдаю за всеми вашими обновлениями. : D Не могу поблагодарить вас за вашу тщательность. emmagras
@wagras -pprint модуль для «красивой печати»; данные, это просто простой способ печати массивов и словарей в этом формате строки / столбца, а не только в одной строке.

Похожие вопросы