2015-10-07 56 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