我从加速度计获取数据包。那些包含固定长度的x,y,z(每个10个)加速度的测量值。我想从连续的包中制作时间序列。当缺少包裹时,我完成了之前的时间序列并开始制作新的时间序列。
数据是两个np.arrays(只是为了让它更清晰)。第一个包含包的索引:
share_num = np.array([1, 2, 3, 5, 8, 9, 10 ...], dtype=int)
第二个包含链接到包的索引的数据:
share_sensor = np.array([[x1_1,y1_1,z1_1,...,x10_1,y10_1,z10_1],
[x1_2,y1_2,z1_2,...,x10_2,y10_2,z10_2],
... ], dtype=int)
此特定示例的输出(在我的例子中是np.arrays的列表),因为从1到3有连续的数字:
X = [np.array([x1_1,y1_1,z1_1,...,x10_3,y10_3,z10_3]),
np.array([x1_5,y1_5,z1_5,...,x10_5,y10_5,z10_5]),
np.array([x1_8,y1_8,z1_8,...,x10_10,y10_10,z10_10]),
... ]
我的尝试有效,但我确信它可以改进 - 关于速度,尤其是让它更清晰。我正在制作不同长度的numpy数组列表。
X = []
for idx, (current_num, current_sensor) in enumerate(zip(share_num, share_sensor)):
if idx == 0:
measurement = current_sensor
else:
if current_num - previous_num == 1:
measurement = np.hstack([measurement, current_sensor])
else:
X.append(measurement)
measurement = current_sensor
previous_num = current_num
X.append(measurement)
答案 0 :(得分:1)
这是一种使用numpy原语的方法:
#random data
share_num=sorted(random.sample(range(20),8))
share_sensors=np.random.rand(8,30)
#find "packets"
splits,=(np.diff(share_num)>1).nonzero()
gp_sensors=np.split(share_sensors,splits+1)
X=[g.ravel() for g in gp_sensors]
这种方式效率更高,因为没有复制传感器数据:
In [3]: share_sensors.flags.owndata
Out[3]: True
In [4]: gp_sensors[0].flags.owndata
Out[4]: False
In [5]: X[0].flags.owndata
Out[5]: False