将列表列表转换为2D numpy数组

时间:2020-11-11 18:09:44

标签: python

我有一个列表X,其中包含一个列表列表...例如

X = [ [[], [], [], []], [[], [] ,[], []] ]

当我尝试使用(x)将上面的列表转换为numpy数组时 np.array(),我得到以下信息:

array([list([[],[],[],[]]),
list([list([[],[],[],[]]),....) 

并且该列表以双关语为准。

我在这里做错了什么?我只需要以常规数组形式使用它,这样我就可以用列表不允许的方式对它进行索引(即array[:,1]

2 个答案:

答案 0 :(得分:2)

如果列表的长度不同(在每个嵌套维度中),则您不能对传统的NumPy数组进行转换,因为2D或以上的NumPy数组在其第一维中必须具有相同数量的元素

因此您不能直接将[[1,2],[3,4,5]]转换为numpy数组。应用np.array将为您提供2个元素的numpy数组,其中每个元素都是-array([list([1, 2]), list([3, 4, 5])], dtype=object)的列表对象。我相信这是您面临的问题。

例如,您无法创建2D矩阵-

[[1,2,3,?],
 [4,5,6,7]]

您可能需要做的是在转换为NumPy数组之前,将列表列表的每个列表的元素填充到固定长度(每个维度的长度相等)。

我建议按照下面编写的代码遍历列表列表中的每个列表,以展平您的数据,然后以所需的方式对其进行转换。


如果您的列表长度相同,那么numpy版本1.18.5或更高版本应该不会有问题。

a = [[[1,2],[3,4]],[[5,6],[7,8]]]
np.array(a)
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])

但是,如果仍然无法使用列表列表,则可能需要首先遍历每个元素以拉平列表,然后将其更改为具有所需形状的numpy数组,如下所示-< / p>

a = [[[1,2],[3,4]],[[5,6],[7,8]]]
flat_a = [item for sublist in a for subsublist in sublist for item in subsublist]
np.array(flat_a).reshape(2,2,2)
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])

答案 1 :(得分:0)

尝试一下:

>>> import numpy as np
>>> a = np.array([[[1,2],[3,4],[5,6]],[[7,8],[9,10],[11,12]]])
>>> a
array([[[ 1,  2],
        [ 3,  4],
        [ 5,  6]],

       [[ 7,  8],
        [ 9, 10],
        [11, 12]]])
>>> a.reshape(4,-1)
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])


>>> a.reshape(1,-1)
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])