Матрица Транспонировать в Python - PullRequest
130 голосов
/ 08 февраля 2011

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

theArray = [['a','b','c'],['d','e','f'],['g','h','i']]

, и я хочу, чтобы моя функция придумала

newArray = [['a','d','g'],['b','e','h'],['c', 'f', 'i']]

Другими словами, если бы мне пришлось печатать этот 2D-массив в виде столбцов и строк, я бы хотелстроки, которые нужно превратить в столбцы, а столбцы в строки.

Я сделал это до сих пор, но это не работает

def matrixTranspose(anArray):
    transposed = [None]*len(anArray[0])
    for t in range(len(anArray)):
        for tt in range(len(anArray[t])):
            transposed[t] = [None]*len(anArray)
            transposed[t][tt] = anArray[tt][t]
    print transposed

Ответы [ 16 ]

287 голосов
/ 08 февраля 2011

Python 2:

>>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
>>> zip(*theArray)
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]

Python 3:

>>> [*zip(*theArray)]
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
61 голосов
/ 09 июля 2012
>>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
>>> [list(i) for i in zip(*theArray)]
[['a', 'd', 'g'], ['b', 'e', 'h'], ['c', 'f', 'i']]

генератор списков создает новый двумерный массив с элементами списка вместо кортежей.

34 голосов
/ 08 февраля 2011

Если ваши строки не равны, вы также можете использовать map:

>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
>>> map(None,*uneven)
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]

Редактировать: В Python 3 функциональность map изменена, вместо нее можно использовать itertools.zip_longest:
Источник: Что нового в Python 3.0

>>> import itertools
>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
>>> list(itertools.zip_longest(*uneven))
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]
15 голосов
/ 08 декабря 2014

Гораздо проще с NumPy:

>>> arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> arr.T
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
>>> theArray = np.array([['a','b','c'],['d','e','f'],['g','h','i']])
>>> theArray 
array([['a', 'b', 'c'],
       ['d', 'e', 'f'],
       ['g', 'h', 'i']], 
      dtype='|S1')
>>> theArray.T
array([['a', 'd', 'g'],
       ['b', 'e', 'h'],
       ['c', 'f', 'i']], 
      dtype='|S1')
4 голосов
/ 08 марта 2012

Чтобы завершить ответ Дж.Ф. Себастьяна, если у вас есть список списков разной длины, прочитайте этот великолепный пост от ActiveState .Вкратце:

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

Для обработки списка списков различной длины используйте:

def transposed(lists):
   if not lists: return []
   return map(lambda *row: list(row), *lists)

def transposed2(lists, defval=0):
   if not lists: return []
   return map(lambda *row: [elem or defval for elem in row], *lists)
4 голосов
/ 08 февраля 2011

Проблема с вашим исходным кодом заключалась в том, что вы инициализировали transpose[t] на каждом элементе, а не один раз на строку:

def matrixTranspose(anArray):
    transposed = [None]*len(anArray[0])
    for t in range(len(anArray)):
        transposed[t] = [None]*len(anArray)
        for tt in range(len(anArray[t])):
            transposed[t][tt] = anArray[tt][t]
    print transposed

Это работает, хотя есть и другие способы Python для выполнения тех же задач, включая приложение zip @ J.F.

3 голосов
/ 13 июня 2013

«Лучший» ответ уже отправлен, но я подумал, что могу добавить, что вы можете использовать вложенные списки, как показано в Python Tutorial .

Вот как можно получить транспонированный массив:

def matrixTranspose( matrix ):
    if not matrix: return []
    return [ [ row[ i ] for row in matrix ] for i in range( len( matrix[ 0 ] ) ) ]
1 голос
/ 03 февраля 2016

Это сохранит прямоугольную форму, так что последующие транспонирования получат правильный результат:

import itertools
def transpose(list_of_lists):
  return list(itertools.izip_longest(*list_of_lists,fillvalue=' '))
0 голосов
/ 05 июля 2019

Если вы хотите транспонировать матрицу типа A = np.array ([[1,2], [3,4]]), то вы можете просто использовать AT, но для вектора, подобного a = [1,2], aT не возвращает транспонирование!и вам нужно использовать a.reshape (-1, 1), как показано ниже

import numpy as np
a = np.array([1,2])
print('a.T not transposing Python!\n','a = ',a,'\n','a.T = ', a.T)
print('Transpose of vector a is: \n',a.reshape(-1, 1))

A = np.array([[1,2],[3,4]])
print('Transpose of matrix A is: \n',A.T)
0 голосов
/ 14 февраля 2018

Python Программа для транспонирования матрицы:

row,col = map(int,input().split())
matrix = list()

for i in range(row):
    r = list(map(int,input().split()))
    matrix.append(r)

trans = [[0 for y in range(row)]for x in range(col)]

for i in range(len(matrix[0])):
    for j in range(len(matrix)):
        trans[i][j] = matrix[j][i]     

for i in range(len(trans)):
    for j in range(len(trans[0])):
        print(trans[i][j],end=' ')
    print(' ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...