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