Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Transposing a 3D list in Python

Tags:

python

I have to transpose a 3d list the following way:

Input:

matrix7 = [[['A ', 'E ', 'C#'], ['B ', 'E ', 'C#'], ['C ', 'E ', 'C#']], 
[['  ', 'F#', 'D '], ['  ', 'F#', 'D '], ['  ', 'F#', 'D ']], 
[['  ', 'E ', 'B '], ['  ', 'E ', 'B '], ['  ', 'E ', 'B ']], 
[['  ', 'E ', 'C#'], ['  ', 'E ', 'C#'], ['  ', 'E ', 'C#']], 
[['  ', 'F#', 'D '], ['  ', 'F#', 'D '], ['  ', 'F#', 'D ']], 
[['  ', 'E ', 'B '], ['  ', 'E ', 'B '], ['  ', 'E ', 'B ']], 
[['  ', '  ', '  '], ['  ', '  ', '  '], ['  ', '  ', '  ']], 
[['  ', 'E ', 'C#'], ['  ', 'E ', 'C#'], ['  ', 'E ', 'C#']]]

desired output:

[[['A ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']], 
[['B ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], 
['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']], 
[['C ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], 
['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']]]

I have the following program:

matrix8 = []
for index in matrix7:
    matrix8 = numpy.array(matrix7).transpose()
    matrix9 = matrix8.tolist()
print matrix9

which is giving me the wrong output:

[[['A ', 'E ', 'C#'], ['B ', 'E ', 'C#'], ['C ', 'E ', 'C#']], 
[['  ', 'F#', 'D '], ['  ', 'F#', 'D '], ['  ', 'F#', 'D ']], 
[['  ', 'E ', 'B '], ['  ', 'E ', 'B '], ['  ', 'E ', 'B ']], 
[['  ', 'E ', 'C#'], ['  ', 'E ', 'C#'], ['  ', 'E ', 'C#']], 
[['  ', 'F#', 'D '], ['  ', 'F#', 'D '], ['  ', 'F#', 'D ']], 
[['  ', 'E ', 'B '], ['  ', 'E ', 'B '], ['  ', 'E ', 'B ']], 
[['  ', '  ', '  '], ['  ', '  ', '  '], ['  ', '  ', '  ']], 
[['  ', 'E ', 'C#'], ['  ', 'E ', 'C#'], ['  ', 'E ', 'C#']]]

Can anyone help me with this?

like image 864
user1189952 Avatar asked Aug 15 '13 19:08

user1189952


2 Answers

I think this is what you want:

numpy.transpose(matrix7, axes=(1, 0, 2)).tolist()  # The 'axes' attribute tells transpose to swaps axes 0 and 1, leaving the last one alone.

OUTPUT:

[[['A ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']],
[['B ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']],
[['C ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']]]
like image 70
Brionius Avatar answered Sep 22 '22 17:09

Brionius


You don't actually need numpy for this:

>>> [list(x) for x in zip(*matrix7)]
[[['A ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']],
 [['B ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']],
 [['C ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']]]

Or, if you don't mind getting a list of tuples of lists, just:

>>> list(zip(*matrix7))
[(['A ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']),
 (['B ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']),
 (['C ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#'])]

Or, in Python 2.x, even less:

>>> zip(*matrix7)
[(['A ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']),
 (['B ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#']),
 (['C ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', 'E ', 'C#'], ['  ', 'F#', 'D '], ['  ', 'E ', 'B '], ['  ', '  ', '  '], ['  ', 'E ', 'C#'])]
like image 43
Zero Piraeus Avatar answered Sep 22 '22 17:09

Zero Piraeus