for i in xrange(100): da.append((i, i*0.1, i*0.2, i*0.3))
data = da.get_data()用array数组采集数据Python标准库中的array数组也提供了动态分配内存的功能,而且它和NumPy数组一样直接将数值的二进制数据保存在一块内存中,因此我们可以先用array数组收集数组,然后通过np.frombuffer()将array数组的数据内存直接转换为一个NumPy数组。下面是一个例子:>>> import numpy as np >>> from array import array >>> a = array("d", [1,2,3,4]) # 创建一个array数组 >>> a array("d", [1.0, 2.0, 3.0, 4.0]) >>> na = np.frombuffer(a, dtype=np.float) # 通过np.frombuffer()创建一个和a共享内存的NumPy数组 >>> na array([ 1., 2., 3., 4.]) >>> na[1] = 20 # 修改NumPy数组中的第一个元素 >>> a array("d", [1.0, 20.0, 3.0, 4.0]) # array数组中的第一个元素也同时改变array数组只支持一维,如果我们需要采集多个频道的数据,可以将这些数据依次添加进array数组,然后通过reshape()方法将np.frombuffer()所创建的NumPy数组改为二维数组。下面是一个例子:buf = array("d") for i in range(100): buf.append(math.sin(i*0.1)) ? buf.append(math.cos(i*0.1))
data = np.frombuffer(buf, dtype=np.float).reshape(-1, 2) ? print data在这个例子中,?我们通过array数组buf采集两个频道的数据,数据采集完毕之后,我们通过np.frombuffer()将其转换为NumPy数组,并通过reshape()将其形状改为(100,2)。用bytearray采集数据当每个频道的数据类型不同时,就不能采用上节所介绍的方法了。这时我们可以使用bytearray收集数据。bytearray是字节数组,因此我们首先需要通过struct模块将Python的数值转换成其字节表示形式。如果数据来自二进制文件或者硬件,那么我们得到得已经是字节数据,这个步骤可以省略。下面是使用bytearray进行数据采集的例子:buf = bytearray() for i in range(100): buf.extend(struct.pack("=hdd", i, math.sin(i*0.1), math.cos(i*0.1))) ?