2016-02-07 41 views
2

比方说,我有尺寸的这个矩阵m 9×9×26:如何转置Python列表中的3D列表?

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

我想皈依尺寸以下矩阵26×81:

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

什么是最好的方式在Python中做到这一点?

+0

它看起来像你正在寻找的不是转置。转置矩阵就像旋转它。你想[重塑](http://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html)它。你可以在这里找到像这样的几个例子[this](http://stackoverflow.com/questions/14476415/reshape-an-array-in-numpy?rq=1)。 – iled

+0

这实际上是一个numpy数组吗? –

+0

对不起,不明确;是的,我想问清楚具体的名单! – Leeren

回答

2

如果你有一个列表,而不是一个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),然后调换了2个轴。

有时这样的问题很混乱,特别是如果他们没有具体的例子来测试。如果我没有把它做对,我需要首先应用转置,并有完整的规范。

例如

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

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

+0

这非常有帮助,谢谢! – Leeren