2017-11-10 4 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]] ] 

その後10×4×2感謝の形状にnumpyの構造にリストのリストの上のリストを変換!

+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ディメンションであり、古いディメンションは新しい第2ディメンションであり、古い第2ディメンション()ディメンションは新しい第3ディメンションです。

+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 yep、うん、それは任意のiterablesで動作するが、 'np.ndarray.transpose'が' * axes'パラメータを取ったことに気付かなかった! –

+0

スワップとロールのバージョンもありますが、私は '転置'を基本的なものと考えています。 – hpaulj

関連する問題