Матрица Transpose в Python

Я пытаюсь создать функцию транспонирования матрицы для 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

Ответ 1

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

Ответ 2

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

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

Ответ 3

Если ваши строки не равны, вы также можете использовать 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')]

Ответ 4

Намного проще с 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')

Ответ 5

Проблема с вашим исходным кодом заключалась в том, что вы инициализировали 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

Это работает, хотя есть более питоновские способы выполнения одних и тех же вещей, в том числе @J.F. zip.

Ответ 6

Чтобы закончить ответ Дж. Ф. Себастьяна, если у вас есть список списков разной длины, посмотрите этот отличный пост из 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)

Ответ 7

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

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

def matrixTranspose( matrix ):
    if not matrix: return []
    return [ [ row[ i ] for row in matrix ] for i in range( len( matrix[ 0 ] ) ) ]

Ответ 8

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

import itertools
def transpose(list_of_lists):
  return list(itertools.izip_longest(*list_of_lists,fillvalue=' '))

Ответ 9

Я внимательно следил за этими подсказками, чтобы транспонировать матрицу. Мне было трудно получить правильный результат, но в конце концов я это сделал. Однако я не понял, почему мое первое решение (A) не сработало (я потратил несколько часов, чтобы устранить это!). Здесь код:

# Matrix to be transposed
X = [[12, 7, 2, 4, 6],
    [4, 5, 7, 2, 4],
    [3, 8, 12, 7, 2],
    [6 ,7, 3, 8, 12]]

# initialize the transposed matrix
# initial A with zeros
row = [0 for i in range(len(X))]

transposed1 = [row] * (len(X[0]))
# initial B with zeros
transposed2 = []
for i in range(len(X[0])):
   transposed2.append([0] * len(X))

# Print the initial matrices
print transposed1
print transposed2

# iterate through rows (i) and columns (j)
for i in range(len(X)):
  for j in range(len(X[0])):
       transposed1[j][i] = X[i][j]

print transposed

Неправильный (не желаемый) вывод для этого кода:

>>> 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

[[6, 4, 2, 12], [6, 4, 2, 12], [6, 4, 2, 12], [6, 4, 2, 12], [6, 4, 2, 12]]

Затем я изменил транспонирование1 на транспонирование2 и наоборот. На этот раз (желаемый) выход:

>>> 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

[[12, 4, 3, 6], [7, 5, 8, 7], [2, 7, 12, 3], [4, 2, 7, 8], [6, 4, 2, 12]]

Как вы можете видеть, инициализированные нулевые матрицы выглядят одинаково, но результат отличается, в зависимости от того, как генерируется нулевая матрица. Можете ли вы понять, почему?

Cheers, Ристо-Матти

Ответ 10

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

импортировать numpy как np a = np.array([1,2]) print ('aT не транспонирует вектор в Python!\n', 'a =', a, '\n', 'aT =', aT ) print ('Транспонировать вектор a is:\n', a.reshape(-1, 1))

A = np.array([[1,2], [3,4]]) print ('Транспонирование матрицы A - это:\n', AT)

Ответ 11

Если вы хотите транспонировать матрицу типа 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)

Ответ 12

def matrixTranspose(anArray):
  transposed = [None]*len(anArray[0])

  for i in range(len(transposed)):
    transposed[i] = [None]*len(transposed)

  for t in range(len(anArray)):
    for tt in range(len(anArray[t])):            
        transposed[t][tt] = anArray[tt][t]
  return transposed

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

print matrixTranspose(theArray)

Ответ 13

#generate matrix
matrix=[]
m=input('enter number of rows, m = ')
n=input('enter number of columns, n = ')
for i in range(m):
    matrix.append([])
    for j in range(n):
        elem=input('enter element: ')
        matrix[i].append(elem)

#print matrix
for i in range(m):
    for j in range(n):
        print matrix[i][j],
    print '\n'

#generate transpose
transpose=[]
for j in range(n):
    transpose.append([])
    for i in range (m):
        ent=matrix[i][j]
        transpose[j].append(ent)

#print transpose
for i in range (n):
    for j in range (m):
        print transpose[i][j],
    print '\n'

Ответ 14

питон 3 простой способ с пониманием

arr = [['a','b','c'],['d','e','f'],['g','h','i']]
transpose = [[arr[y][x] for y in range(len(arr))] for x in range(len(arr[0]))]

Ответ 15

a=[]
def showmatrix (a,m,n):
    for i in range (m):
        for j in range (n):
            k=int(input("enter the number")
            a.append(k)      
print (a[i][j]),

print('\t')


def showtranspose(a,m,n):
    for j in range(n):
        for i in range(m):
            print(a[i][j]),
        print('\t')

a=((89,45,50),(130,120,40),(69,79,57),(78,4,8))
print("given matrix of order 4x3 is :")
showmatrix(a,4,3)


print("Transpose matrix is:")
showtranspose(a,4,3)

Ответ 16

def transpose(matrix):
   x=0
   trans=[]
   b=len(matrix[0])
   while b!=0:
       trans.append([])
       b-=1
   for list in matrix:
       for element in list:
          trans[x].append(element)
          x+=1
       x=0
   return trans

Ответ 17

a = []
m=int(input("enter no of rows in the matrix"))
n=int(input("enter no of columns in the matrix"))
for i in range(0,m) :
    a.append([])
for j in range(0,n) :
    a[i].append((input("enter element")))
print(a)
trans =[]
for i in range(0,m) :
    trans.append([])
    for j in range(0,n) :
        trans[i].append(a[j][i])
print("tranpose matrix :",trans)

Ответ 18

def transpose(matrix):
    listOfLists = []
    for row in range(len(matrix[0])):
        colList = []
        for col in range(len(matrix)):
            colList.append(matrix[col][row])
    listOfLists.append(colList)

    return listOfLists

Ответ 19

`

def transpose(m):
    return(list(map(list,list(zip(*m)))))

Ответ 20

Программа 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(' ')