在Python中转置一个三维列表

5
我要按以下方式转置一个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#']]]

这个可以有人帮我吗?

1
你展示的代码不可能正常工作。你为每个顶级列表创建了一个完整的3D列表的数组,而不是将子列表创建为2D数组。而且你在循环中每次都替换matrix9,所以除了最后一次迭代之外,其他所有迭代都是无意义的。你还在一个3D数组上调用了transpose,但它并不按照你期望的方式在3D数组上工作(它只是反转了所有3个轴的顺序)。 - abarnert
1
另外,你为什么要在数组和列表之间来回转换呢?为什么不一开始就使用一个三维数组呢?这样做只会让你的代码更难理解、更冗长、更慢,而没有任何好处。 - abarnert
1
@abarnert: numpy.ndarray.transpose 是一个真正的方法。 - user2357112
@user2357112:抱歉,编辑失败了。当然它是存在的,但它不会转置前两个轴,这似乎是OP想要的。 - abarnert
2个回答

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接