By Julio Diaz


2011-02-08 19:38:48 8 Comments

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

18 comments

@sharif_42 2020-02-10 11:10:46

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)

@rasoul poordelan 2019-09-27 21:50:59

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

@RyanNerd 2019-09-27 22:29:44

Although this may be a correct answer. Two lines of code isn't very useful without an explanation of what and how it solves the original question. Please provide details to your answer.

@Jean-François Fabre 2019-09-28 09:05:18

when posting a new answer to an old question, expectations are high. Please don't post an inferior solution to the ones already posted

@Hassan Bahaloo 2019-07-05 06:57:22

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)

@jfs 2011-02-08 19:41:39

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

@Antony Hatchkins 2013-03-28 08:38:38

if you're going to iterate through the results, izip from itertools can save memory for large arrays.

@acollection_ 2016-02-28 03:15:19

How would you have it return a list for the sub lists? Like [['a', 'b', 'g'], ['d', 'e', 'h'], ['c', 'f', 'i']] instead of [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]?

@jfs 2016-02-28 12:45:33

@acollection_: map(list, zip(*theArray)).

@user3728501 2016-10-20 16:38:15

Why the asterisk?

@jfs 2016-10-20 17:14:40

@user3728501 2016-10-20 17:23:24

@J.F.Sebastian I read that but unfortunately I didn't understand any of it

@jfs 2016-10-20 18:01:45

@user3728501 have you just read the question, its duplicate and their more than a dozen answers in 8 minutes? Or have you seen them before? The argument unpacking is discussed even in the official Python tutorial. If it is still unclear; pick an answer that you understand the most and ask a separate question about the unclear parts.

@M.K Rana 2018-02-14 14:13:47

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

@Quadcubic 2019-05-08 04:28:32

This is not useful!

@user2412711 2017-08-19 18:10:40

`

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

`This function will return the transpose

@Ravneet Singh 2017-08-14 21:58:13

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

@Ravneet Singh 2017-08-14 22:00:08

Its a simple implementation for a transpose, though there are libraries like mentioned in other answers are also available.

@mohammad hassan jafari 2016-03-13 19:16:41

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

@Vanuan 2016-02-03 18:51:17

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

@chaitanya 2015-03-30 05:56:18

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)

@Irshad Bhat 2014-12-08 05:34:55

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

@roo.firebolt 2014-04-27 18:21: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'

@leetNightshade 2013-06-12 21:47:29

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

@bigjim 2011-02-08 20:38:07

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

@Asterisk 2011-02-08 19:51:49

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)

@sqwerl 2012-07-08 23:05:21

>>> 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.

@ASL 2016-10-17 19:34:37

This is the way to go if you want to assign the result to a variable (as opposed to, e.g., iterating over it directly) — assuming you want lists instead of tuples, as mentioned.

@ASL 2016-10-18 12:42:20

Another option (as implied by the comments in the accepted answer) would be: list(map(list, zip(*theArray)))

@Franck Dernoncourt 2012-03-08 18:05:56

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)

@Olli 2012-10-04 08:07:52

That's good catch. However, matrices doesn't have lists with different lengths.

@Franck Dernoncourt 2013-03-09 00:59:47

It depends on how they are stored.

@Ned Batchelder 2011-02-08 19:48:29

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.

@Vector 2019-11-10 03:18:12

Note that this implementation doesn't work with matrices that have different numbers of columns and rows

Related Questions

Sponsored Content

29 Answered Questions

[SOLVED] Finding the index of an item given a list containing it in Python

  • 2008-10-07 01:39:38
  • Eugene M
  • 3645434 View
  • 2995 Score
  • 29 Answer
  • Tags:   python list indexing

36 Answered Questions

[SOLVED] How to get the current time in Python

  • 2009-01-06 04:54:23
  • user46646
  • 3165973 View
  • 2721 Score
  • 36 Answer
  • Tags:   python datetime time

64 Answered Questions

[SOLVED] Calling an external command from Python

7 Answered Questions

[SOLVED] Manually raising (throwing) an exception in Python

  • 2010-01-12 21:07:40
  • TIMEX
  • 1663425 View
  • 2159 Score
  • 7 Answer
  • Tags:   python exception

18 Answered Questions

[SOLVED] What are metaclasses in Python?

23 Answered Questions

[SOLVED] Does Python have a ternary conditional operator?

25 Answered Questions

[SOLVED] How do I concatenate two lists in Python?

10 Answered Questions

[SOLVED] Does Python have a string 'contains' substring method?

Sponsored Content