按交换维度重组列表并转换为numpy

时间:2017-11-10 20:40:45

标签: python python-3.x list numpy reshape

我有以下格式的列表清单:

[ [[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 x 4 x 2形状的numpy结构。谢谢!

2 个答案:

答案 0 :(得分:3)

你可以在这里use tranpose

import numpy as np

ar = np.array(data)

然后:

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)维度是新的第三维度。

答案 1 :(得分: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)