write una tutorial transpuesta multidimensionales matriz lists linalg array python list multidimensional-array

una - Matrix Transpose en Python



transpuesta de una matriz python numpy (16)

Éste conservará la forma rectangular, por lo que los traslados posteriores obtendrán el resultado correcto:

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

Intento crear una función de transposición matricial para Python, pero parece que no puedo hacerlo funcionar. Digamos que tengo

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

y quiero que mi función se presente

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

En otras palabras, si tuviera que imprimir esta matriz 2D como columnas y filas, me gustaría que las filas se convirtieran en columnas y columnas en filas.

Hice esto hasta ahora, pero no funciona

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


El problema con el código original era que inicializó la transpose[t] en cada elemento, en lugar de solo una vez por fila:

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

Esto funciona, aunque hay más formas de Pythonic para lograr las mismas cosas, incluida la aplicación zip @ JF.


La "mejor" respuesta ya ha sido enviada, pero pensé que agregaría que puedes usar la lista anidada de comprensión, como se ve en el Tutorial de Python .

Aquí es cómo puedes obtener una matriz transpuesta:

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


Mucho más fácil con 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'')


Para completar la respuesta de JF Sebastian, si tiene una lista de listas con longitudes diferentes, consulte esta gran publicación de ActiveState . En breve:

La función incorporada zip hace un trabajo similar, pero trunca el resultado a la longitud de la lista más corta, por lo que algunos elementos de los datos originales pueden perderse posteriormente.

Para manejar la lista de listas con diferentes longitudes, use:

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)


Programa de Python para transponer la matriz:

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


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


Si sus filas no son iguales, también puede usar el map :

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

Editar: en Python 3 la funcionalidad del map cambió, itertools.zip_longest puede usarse en su lugar:
Fuente: Novedades en 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'')]


`

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

`Esta función devolverá la transposición


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


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

el generador de listas crea una nueva matriz 2d con elementos de lista en lugar de tuplas.


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)


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)


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)


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


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