2017-11-10 144 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