检查包的索引是否是连续的,然后加入他们的数据

时间:2017-07-01 15:35:31

标签: python numpy for-loop indexing append

我从加速度计获取数据包。那些包含固定长度的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)

1 个答案:

答案 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