在Python中转置3D列表

时间:2013-08-15 19:21:42

标签: python

我必须按以下方式转置3D列表:

输入:

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

期望的输出:

[[['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#']]]

我有以下程序:

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

这给了我错误的输出:

[[['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#']]]

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:12)

我认为这就是你想要的:

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

<强>输出:

[[['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#']]]

答案 1 :(得分:3)

你实际上并不需要numpy:

>>> [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#']]]

或者,如果您不介意获取列表元组列表,只需:

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

或者,在Python 2.x中,甚至更少:

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