I am trying to create a matrix transpose function for python but I can't seem to make it work. Say I have
theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
and I want my function to come up with
newArray = [['a','d','g'],['b','e','h'],['c', 'f', 'i']]
So in other words, if I were to print this 2D array as columns and rows I would like the rows to turn into columns and columns into rows.
I made this so far but it doesn't work
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
Solution 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')]
Solution 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']]
the list generator creates a new 2d array with list items instead of tuples.
Solution 3
If your rows are not equal you can also use map:
>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
>>> map(None,*uneven)
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]
Edit: In Python 3 the functionality of map changed, itertools.zip_longest can be used instead:
Source: Whats New In 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')]
Solution 4
Much easier with 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')
Solution 5
The problem with your original code was that you initialized transpose[t] at every element, rather than just once per row:
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
This works, though there are more Pythonic ways to accomplish the same things, including @J.F.'s zip application.
Solution 6
To complete J.F. Sebastian's answer, if you have a list of lists with different lengths, check out this great post from ActiveState. In short:
The built-in function zip does a similar job, but truncates the result to the length of the shortest list, so some elements from the original data may be lost afterwards.
To handle list of lists with different lengths, 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)
Solution 7
The "best" answer has already been submitted, but I thought I would add that you can use nested list comprehensions, as seen in the Python Tutorial.
Here is how you could get a transposed array:
def matrixTranspose( matrix ):
if not matrix: return []
return [ [ row[ i ] for row in matrix ] for i in range( len( matrix[ 0 ] ) ) ]
Solution 8
This one will preserve rectangular shape, so that subsequent transposes will get the right result:
import itertools
def transpose(list_of_lists):
return list(itertools.izip_longest(*list_of_lists,fillvalue=' '))
Solution 9
you can try this with list comprehension like the following
matrix = [['a','b','c'],['d','e','f'],['g','h','i']]
n = len(matrix)
transpose = [[row[i] for row in matrix] for i in range(n)]
print (transpose)
Solution 10
If you want to transpose a matrix like A = np.array([[1,2],[3,4]]), then you can simply use A.T, but for a vector like a = [1,2], a.T does not return a transpose! and you need to use a.reshape(-1, 1), as below
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)
Solution 11
You may do it simply using python comprehension.
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]))]
Solution 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)
Solution 13
import numpy as np #Import Numpy
m=int(input("Enter row")) #Input Number of row
n=int(input("Enter column")) #Input number of column
a=[] #Blank Matrix
for i in range(m): #Row Input
b=[] #Blank List
for j in range(n):#column Input
j=int(input("Enter Number in Pocket ["+str(i)+"]["+str(j)+"]")) #sow Row Column Number
b.append(j) #addVlaue to list
a.append(b)#Add List To Matrix
a=np.array(a)#convert 1matrix as Numpy
b=a.transpose()#transpose Using Numpy
print(a) #Print Matrix
print(b)#print Transpose Matrix
Solution 14
#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'
Solution 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)
Solution 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
Solution 17
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
Solution 18
`
def transpose(m):
return(list(map(list,list(zip(*m)))))
`This function will return the transpose
Solution 19
Python Program to transpose matrix:
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(' ')
