2017-11-10 145 views
1

我名单列表中的格式如下列表:重组名单,并转换为numpy的

[ [[a1_1, a1_2, a1_3, a1_4], [b1_1, b1_2, b1_3, b1_4]], 
    [[a2_1, a2_2, a2_3, a2_4], [b2_1, b2_2, b2_3, b2_4]], 
     : 
     : 
    [[a10_1, a10_2, a10_3, a10_4], [b10_1, b10_2, b10_3, b10_4]] ] 

除了叠代的每个元素,并将其添加到新的结构,有一种优雅的方式实现如下:

重组列表中:

[ [[ a1_1, b1_1], [a1_2, b1_2], [a1_3, b1_3], [a1_4, b1_4]], 
    [[ a2_1, b2_1], [a2_2, b2_2], [a2_3, b2_3], [a2_4, b2_4]], 
       : 
       : 
    [[ a10_1, b10_1], [a10_2, b10_2], [a10_3, b10_3], [a10_4, b10_4]] ] 

然后转换列表的列表的上述列表中,以numpy的结构在10×4×2。感谢的形状!

+0

总是使用通用的Python标签,如果您的问题是特定于版本的(它似乎不是),则只使用版本特定的标签。 –

+0

您可以按原样将其制作为阵列,然后重新塑形或交换轴。数组通常比列表更容易。 – hpaulj

回答

3

您可以use tranpose这里:

import numpy as np 

ar = np.array(data) 

和T母鸡:

ar.transpose((0,2,1)) 

或等价的:

ar.transpose(0,2,1) 

如果我写字符串到变量,然后用你的样本数据,我得到:

>>> ar 
array([[['a_1_1', 'a_1_2', 'a_1_3', 'a_1_4'], 
     ['b_1_1', 'b_1_2', 'b_1_3', 'b_1_4']], 

     [['a_2_1', 'a_2_2', 'a_2_3', 'a_2_4'], 
     ['b_2_1', 'b_2_2', 'b_2_3', 'b_2_4']], 

     [['a_10_1', 'a_10_2', 'a_10_3', 'a_10_4'], 
     ['b_10_1', 'b_10_2', 'b_10_3', 'b_10_4']]], 
     dtype='<U6') 
>>> ar.transpose((0,2,1)) 
array([[['a_1_1', 'b_1_1'], 
     ['a_1_2', 'b_1_2'], 
     ['a_1_3', 'b_1_3'], 
     ['a_1_4', 'b_1_4']], 

     [['a_2_1', 'b_2_1'], 
     ['a_2_2', 'b_2_2'], 
     ['a_2_3', 'b_2_3'], 
     ['a_2_4', 'b_2_4']], 

     [['a_10_1', 'b_10_1'], 
     ['a_10_2', 'b_10_2'], 
     ['a_10_3', 'b_10_3'], 
     ['a_10_4', 'b_10_4']]], 
     dtype='<U6') 

transpose作为输入数组和一系列指数。它重新排列这样的指数,使得(如果我们给它(0,2,1)),旧的第一个(0)维度;是新的第一维,旧的第三维(2)维度是新的第二维度,而旧的第二维度(1)维度是新的第三维度。

+0

不知道'.transpose'带了一个'* axes'参数! –

+0

@ juanpa.arrivillaga:我都不是:),这是偶然:) –

2

如果你已经有一个列表,你应该能够做到这一点比较怕疼,只要使用zip转成语的子列表:

arr = np.array([list(zip(*sub)) for sub in my_list]) 

所以,只用3行...

In [1]: data = [ [['a1_1', 'a1_2', 'a1_3', 'a1_4'], ['b1_1', 'b1_2', 'b1_3', 'b1_4']], 
    ...:   [['a2_1', 'a2_2', 'a2_3', 'a2_4'], ['b2_1', 'b2_2', 'b2_3', 'b2_4']], 
    ...:   [['a10_1', 'a10_2', 'a10_3', 'a10_4'], ['b10_1', 'b10_2', 'b10_3', 'b10_4']] ] 

In [2]: [list(zip(*sub)) for sub in data] 
Out[2]: 
[[('a1_1', 'b1_1'), ('a1_2', 'b1_2'), ('a1_3', 'b1_3'), ('a1_4', 'b1_4')], 
[('a2_1', 'b2_1'), ('a2_2', 'b2_2'), ('a2_3', 'b2_3'), ('a2_4', 'b2_4')], 
[('a10_1', 'b10_1'), ('a10_2', 'b10_2'), ('a10_3', 'b10_3'), ('a10_4', 'b10_4')]] 

In [3]: import numpy as np 

In [4]: np.array([list(zip(*sub)) for sub in data]) 
Out[4]: 
array([[['a1_1', 'b1_1'], 
     ['a1_2', 'b1_2'], 
     ['a1_3', 'b1_3'], 
     ['a1_4', 'b1_4']], 

     [['a2_1', 'b2_1'], 
     ['a2_2', 'b2_2'], 
     ['a2_3', 'b2_3'], 
     ['a2_4', 'b2_4']], 

     [['a10_1', 'b10_1'], 
     ['a10_2', 'b10_2'], 
     ['a10_3', 'b10_3'], 
     ['a10_4', 'b10_4']]], 
     dtype='<U5') 

In [5]: np.array([list(zip(*sub)) for sub in data]).shape 
Out[5]: (3, 4, 2) 
+0

'zip(*)'是列表版本'transpose'。 – hpaulj

+0

@hpaulj是的,好吧,它适用于任意迭代,但我不知道'np.ndarray.transpose'带了一个'* axes'参数! –

+0

也有交换和滚动版本,但我认为'转置'是基本的。 – hpaulj