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 019 Answers
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')] 9>>> 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.
2If 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: What’s 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')] 0Much 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') 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.
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) 2The "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 ] ) ) ] 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=' ')) 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)
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) 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]))] 2def 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) 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 #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' 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) 0def 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 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 1`
def transpose(m): return(list(map(list,list(zip(*m)))))`This function will return the transpose
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(' ') 1