列表的列表转换为numpy数组

14 浏览
0 Comments

列表的列表转换为numpy数组

如何将一个简单的列表列表转换成numpy数组?行是单独的子列表,每一行包含子列表中的元素。

0
0 Comments

问题的出现原因是用户想要将一个列表的列表转换成一个Numpy数组。用户提供了两种方法来实现这个转换,但是在处理较大的列表时,第一种方法的性能较差。第二种方法使用了numpy中的concatenate函数,将每个子列表转换成一个numpy数组,并将它们拼接在一起。这样得到的结果是一个多维的numpy数组。

解决方法是使用numpy中的concatenate函数,将每个子列表转换成一个numpy数组,并将它们拼接在一起。这样得到的结果就是一个多维的numpy数组。

总之,用户想要将一个列表的列表转换成一个Numpy数组,提供了两种方法来实现这个转换。第一种方法使用numpy中的hstack函数,将每个子列表转换成一个numpy数组,并将它们水平拼接在一起。第二种方法使用了numpy中的concatenate函数,将每个子列表转换成一个numpy数组,并将它们拼接在一起。第二种方法的性能更好,所以更推荐使用。

0
0 Comments

问题的出现原因是因为numpy的array函数会自动将一个列表的列表转换成一个二维数组,前提是所有包含的列表的长度相同。但是有时候我们并不希望这样做,而是希望将一个列表的列表转换成一个由列表组成的数组,即使所有的列表长度相同。或者我们想要将一个二维数组转换成一个由一维数组组成的数组,但是希望能够高效地完成,而不使用迭代方法或者Python的map函数。

解决方法是通过使用numpy的array函数的参数dtype来指定数组的数据类型。通过将dtype参数设置为object,我们可以创建一个由列表组成的数组,而不是二维数组。代码如下:


import numpy as np
arr = np.array([[1, 2], [3, 4]], dtype=object)
print(arr)

这样我们就可以将一个列表的列表转换成一个由列表组成的数组,即使所有的列表长度相同。同样地,我们也可以将一个二维数组转换成一个由一维数组组成的数组。只需要将二维数组的每一个元素都转换成一维数组,然后将这些一维数组组成一个新的数组。代码如下:


import numpy as np
arr = np.array([[1, 2], [3, 4]])
arr = np.array([np.array(row) for row in arr])
print(arr)

如果我们的子列表的长度不均匀,那么上述方法将不适用。在这种情况下,可以参考stackoverflow上的一个答案,该答案提供了一种解决这个问题的方法。具体内容请参考链接:the following answer

至于numpy的array函数在处理数据长度时的速度问题,官方文档中并没有给出具体的解释。

0
0 Comments

问题的出现原因:

在将列表的列表转换为numpy数组时,如果列表中的列表具有不同数量的元素,则Ignacio Vazquez-Abrams的解决方法将不起作用。这是因为numpy数组需要具有相同长度的元素。

解决方法:

有至少三种解决方法:

1) 创建一个数组的数组:

x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>> 
type(y[0])
>>> 

2) 创建一个列表的数组:

x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>> 
type(y[0])
>>> 

3) 首先使列表的长度相等:

x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>> array([[1, 2, None],
>>>        [1, 2, 3],
>>>        [1, None, None]], dtype=object)

也可以使用dtype=float,它将None转换为np.nan,可能会有用处。

在Python 3.9上,我不得不在第三种解决方法中使用(np.vectorize(len)(x)).max()代替max(map(len, x))

同时,你会得到一个警告:VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray return array(a, dtype, copy=False, order=order)

0