2015-10-07 52 views
0

匹配近似时间戳我有从两个单独的传感器获得的时间戳的两个列表,像这样:高效在Python

reference = [99999.0, 100000.0, 100001.0,...] 

sensor = [99999.8234, 99999.9723, 100000.00123, ... , 100000.9924, 100001.02,...] 

我想在值sensor有效地提取所述索引最接近的匹配中的每个值reference

在上面的示例中reference[0]是早于sensor[0]的时间戳,因此应该丢弃。我希望代码返回[indexof(100000.00123), indexof(100000.9924)]

参考和传感器时间戳的列表已经排序。

我的尝试是这样的:

sensor_ind = [] 
ind = 0 

for t in reference: 
    last_diff = 999999999.99 
    while np.fabs(sensor[ind]-t) < last_diff: 
     last_diff = np.fabs(sensor[ind]-t) 
     ind += 1 

    sensor.append(ind) 

print sensor 

回答

1
def closest(l, R): 

    from operator import itemgetter 

    tupleList = zip(l, [ abs(x - R) for x in l ]) 

    closeToR, delta = sorted(tupleList, key=itemgetter(1)).pop(0) 

    return closeToR 

for el in reference: 
    print(closest(sensor,el)) 

99999.8234 
100000.0
100000.9924 
使用

平分您可以在平分模块

,它会发现100001.0参考 指数3传感器是100000.9924

bisect

def get_match(list_, el): 
    import bisect 

    i = bisect.bisect_left(list_, el) 

    if i == len(list_): 
     return i - 1 
    elif list_[i] == el: 
     return i 
    elif i > 0: 
     j = i - 1 

     if list_[i] - el > el - list_[j]: 
      return j 
    return 

reference = [99999.0, 100000.0, 100001.0] 

sensor = [99999.8234, 99999.9723, 100000.00123, 100000.9924, 100001.02] 

for el in reference: 
    print(get_match(sensor,el)) 

None 
None 
3