将嵌套的数据列表转换为多维Numpy数组

6
在下面的代码中,我正在使用嵌套列表构建数据。在for循环之后,我想要将其转换为多维Numpy数组,使其尽可能整洁。但是,当我对它进行数组转换时,似乎只有外部列表被转换为数组。更糟糕的是,当我继续向下走时,我会得到形状为(100L,)的数据点...每个列表都是我的数据(显然,我想要一个(100,3))。我也尝试了numpy.asanyarray(),但是我似乎无法解决它。如果可能的话,我真的希望从一开始就从我的三维列表中获得3D数组。如果不行,如何在不必迭代并全部转换它们的情况下将列表数组转换为2D数组?
编辑:如果可以使处理更容易,我也可以从一开始就更好地构造数据结构。但是,它通过串行端口传输,大小事先未知。
import numpy as np
import time

data = []
for _i in range(100):   #build some list of lists
    d = [np.random.rand(), np.random.rand(), np.random.rand()]
    data.append([d,time.clock()])

dataArray = np.array(data)  #now I have an array of lists of a list(of data) and a time
dataPoints = dataArray[:,0] #this is the data in an array of lists

1
你没有一个三维嵌套列表,而是混合了列表和标量。data 是一个包含像这样的对象的列表:[[0.434,0.34,0.22],0.2]。这是一个混合对象,因此 numpy 不知道该怎么处理它。 - Bitwise
这适用于原始数据对象,这就是为什么我不确定是否可能从那里开始的原因。然而,dataPoints对象是一个浮点数列表数组,我似乎也无法将其转换为2D数组。 - Matt
2个回答

8

dataPoints不是一个二维列表。先将它转换为二维列表,然后它就可以正常工作了:

d=np.array(dataPoints.tolist())

现在d的形状已经变成了您想要的(100,3)。

是的,dataPoints是一个列表数组。这样做是可行的,但从for循环之后来看,这是最好的方法吗?我最终需要将其转换为数组(以便进行切片操作),然后再转换回列表(以获得正确的形状),最后再转换回数组。 - Matt
跳过数组转换和切片。仅附加d(留出time.clock(),因为您稍后会将其切片)。这将给您一个列表的列表,然后您可以将其转换为数组。或者,更好的方法是一开始就使用numpy数组,而不使用列表。 - Bitwise
我需要在代码的其他部分使用时间戳,但是在数据通过串口逐渐传输时,我不知道它的大小。不过你提供的解决方案是目前我找到的最好的。 - Matt
@MattAnderson 为什么不直接将时间戳附加到数字三元组中,这样你就可以得到一个(100,4)的数组了呢?你希望最终数组的维度是多少? - Bitwise
我猜可能因为那太简单了。可能只是因为在我的脑海中,一个是时间,一个是数据,我没有考虑到在这种情况下时间只是另一种数据。谢谢你的帮助。 - Matt

-1
如果你需要一个二维数组:
from itertools import chain
dataArray = np.array(list(chain(*data)),shape=(100,3))

我没有解决代码,所以您可能需要更改列/行顺序以使形状匹配。


如果我理解正确的话,这只是在每个列表上进行迭代并对其进行np.array()操作。我想我只是觉得还有更好的方法,如果没有的话,我会接受这个方法。 - Matt
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.array.html 我不确定你从哪里获取了shape参数。 - Francisco Vargas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接