Транспонирование матрицы в Python - программирование
Подтвердить что ты не робот

Транспонирование матрицы в Python

Я пытаюсь создать функцию транспонирования матрицы в Python. Матрица представляет собой двумерный массив, представленный как список списков целых чисел. Например, следующая матрица 2X3 (это означает, что высота матрицы равна 2, а ширина равна 3):

A=[[1, 2, 3],
   [4, 5, 6]]

Чтобы быть транспонированным, j-й элемент в i-м индексе должен стать i-м элементом в j-м индексе. Здесь, как рассмотренный выше образец будет выглядеть транспонированным:

>>> transpose([[1, 2, 3],
               [4, 5, 6]])
[[1, 4],
[2, 5],
[3, 6]]
>>> transpose([[1, 2],
               [3, 4]])
[[1, 3],
[2, 4]]

Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете использовать zip с помощью *, чтобы получить транспонирование матрицы:

>>> A = [[ 1, 2, 3],[ 4, 5, 6]]
>>> zip(*A)
[(1, 4), (2, 5), (3, 6)]
>>> lis  = [[1,2,3], 
... [4,5,6],
... [7,8,9]]
>>> zip(*lis)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

Если вы хотите, чтобы возвращаемый список был списком списков:

>>> [list(x) for x in zip(*lis)]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
#or
>>> map(list, zip(*lis))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

Ответ 2

Есть ли выигрыш за ленивость и использование функции транспонирования массивов NumPy?;)

import numpy as np

a = np.array([(1,2,3), (4,5,6)])

b = a.transpose()

Ответ 3

Если бы мы хотели вернуть ту же матрицу, мы напишем:

return [[ m[row][col] for col in range(0,width) ] for row in range(0,height) ]

Что это значит, он выполняет итерацию по матрице m, просматривая каждую строку и возвращая каждый элемент в каждом столбце. Таким образом, порядок будет выглядеть следующим образом:

[[1,2,3],
[4,5,6],
[7,8,9]]

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

[[1,4,7],
[2,5,8],
[3,6,9]]

Поэтому просто переключите порядок, в котором мы итерируем:

return [[ m[row][col] for row in range(0,height) ] for col in range(0,width) ]