如何在Python中转置一个三维列表?

3

假设我有一个尺寸为9 x 9 x 26的矩阵m:

[[['a00', ... 'z00'], ['a01', ... 'z01'], ... ['a09', ... 'z09']],
[['a10', ... 'z10'], ['a11', ... 'z11'], ... ['a19', ... 'z19']],
...
[['a90', ... 'z90'], ['a91', ... 'z91'], ... ['a99', ... 'z99']]]

我希望将A转换为一个维度为26 x 81的矩阵:

 [['a00', 'a01', ... 'a09', 'a10', ... 'a19', ... 'a99'],
  ['z00', 'z01', ... 'z09', 'z10', ... 'z19', ... 'z99']]

在 Python 中,最好的方法是什么?


看起来你所寻找的不是转置。矩阵的转置就像旋转它一样。你想要改变形状 。你可以在此处找到几个示例,例如这个 - iled
这实际上是一个numpy数组吗? - Padraic Cunningham
抱歉没有表达清楚,是的,我想特别询问关于列表的问题! - Leeren
2个回答

4
如果您有一个列表而不是numpy数组:
m = [[['a00',  'z00'], ['a01',  'z01'],  ['a09',  'z09']],
[['a10',  'z10'], ['a11',  'z11'],  ['a19',  'z19']],   
[['a90',  'z90'], ['a91',  'z91'],  ['a99',  'z99']]]

from itertools import chain
print zip(*(chain(*m))

[('a00', 'a01', 'a09', 'a10', 'a11', 'a19', 'a90', 'a91', 'a99'), 
('z00', 'z01', 'z09', 'z10', 'z11', 'z19', 'z90', 'z91', 'z99')]

3
这是您想要的重新排序方式吗?
In [128]: a=[[[11,12,13],[14,15,16]],[[21,22,23],[24,25,26]]]

In [129]: A=np.array(a)

In [130]: A
Out[130]: 
array([[[11, 12, 13],
        [14, 15, 16]],

       [[21, 22, 23],
        [24, 25, 26]]])

In [131]: A.reshape(-1,3).T
Out[131]: 
array([[11, 14, 21, 24],
       [12, 15, 22, 25],
       [13, 16, 23, 26]])

A(2,2,3),结果是 (3,4)

我将其重塑为 (4,3),然后转置了两个轴。

有时这样的问题会令人困惑,特别是如果它们没有一个具体的例子来测试。如果我没有理解正确,可能需要先应用转置,附带完整的规范。

例如:

In [136]: A.transpose([2,0,1]).reshape(3,-1)
Out[136]: 
array([[11, 14, 21, 24],
       [12, 15, 22, 25],
       [13, 16, 23, 26]])

如果你有一个列表,而不是一个数组,那么任务会更加困难。有一个简单的习语可以将“2d”嵌套列表进行“转置”,但它可能不适用于“3d”。
In [137]: zip(*a)
Out[137]: [([11, 12, 13], [21, 22, 23]), ([14, 15, 16], [24, 25, 26])]

(好的,另一个答案提供了非数组解决方案)。


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