将数组转换为列表

时间:2017-03-11 22:35:31

标签: python numpy

我有一个数组列表:

[[array([  0.00000000e+00,  -1.00000000e+00,  -6.12323400e-17]), array([  0.00000000e+00,   1.00000000e+00,   6.12323400e-17]), array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])], [[0.9957649076694132, -0.09193611180665112, 0], array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])], [[0.012185959917421326, 0.60870153111176395, -0.0], array([ 0.        , -0.47671475, -0.        ]), array([-0.01218596, -0.13198678,  0.        ]), array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])], [array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])]]

我想知道如何将这样的列表转换为列表列表。 我试图通过使用理解列表来解决这个问题:

ves = [x.tolist() for x in j for j in ves]

但是,我收到了一个错误:

TypeError: 'int' object is not iterable

2 个答案:

答案 0 :(得分:0)

你的列表理解是倒退的。顺序是从左到右,就像它是一个普通的嵌套循环一样。所以

ves = [x.tolist() for x in j for j in ves]

就像

for x in j:
    for j in ves:
        ...

你可以看到这是一个问题,因为它试图将x设置为j中的值,但j还没有存在。

它需要反过来:

ves = [x.tolist() for j in ves for x in j]

答案 1 :(得分:0)

我将此对象复制到Ipython会话中。我看到的是

4项清单

In [246]: ll[0]
Out[246]: 
[array([  0.00000000e+00,  -1.00000000e+00,  -6.12323400e-17]),
 array([  0.00000000e+00,   1.00000000e+00,   6.12323400e-17]),
 array([[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]),
 array([[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]])]

所以这是4个项目列表,其中元素是1d和2d数组。

但是ll[1]包含一个列表(3个项目)和3个2d数组。 ll[3]是4个2d数组。

要将其转换为纯列表,您必须向下迭代2个级别,并将tolist()应用于作为数组的每个元素。如果该项目已经是列表,则不进行转换。

我试着把它写成复合列表理解;我必须这样做,您现在能否处理这些细节?

In [253]: [[l2.tolist() if isinstance(l2,np.ndarray) else l2 for l2 in l1] for l1 in ll]
Out[253]: 
[[[0.0, -1.0, -6.123234e-17],
  [0.0, 1.0, 6.123234e-17],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]],
 [[0.9957649076694132, -0.09193611180665112, 0],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]],
 [[0.012185959917421326, 0.608701531111764, -0.0],
  [0.0, -0.47671475, -0.0],
  [-0.01218596, -0.13198678, 0.0],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]],
 [[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],
  [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]]]