2013-06-27 3 views
1
for i,(x,y,z) in enumerate(zip(analysisValues, analysisValues[1:], analysisValues[2:])): 
    if all(k<0.5 for k in (x,y,z)): 
     instance = i 
     break 

этого кода перебирает массив и выглядит в течение первых 3 последовательных значений, удовлетворяющих условию «< 0,5»итерация через массив смотрит на непоследовательных значений

======== ==================================

Я работаю с данными 'timeseries' и сравниваю значения при t, t + 1s и t + 2s

Если данные отбираются на частоте 1 Гц, то сравниваются 3 последовательных значения, а приведенный выше код (точки 0,1,2)

Если данные сэмплированы на частоте 2 Гц, то следует сравнить любую другую точку (точки 0,2,4) или , если данные отбираются на частоте 3 Гц, затем следует сравнить каждую третью точку (точки 0,3,6)

частота дискретизации входных данных может варьироваться, но, как известно, и записывается в качестве переменной «SRate»

======================= =======

пожалуйста, вы можете помочь мне включить «время» в этом анализе точка за точкой

ответ

1

вы можете использовать расширенный ломтика нотация , Давая значение шага как SRate:

for i,(x,y,z) in enumerate(zip(analysisValues, \ 
           analysisValues[SRate::SRate], \ 
           analysisValues[2 * SRate::SRate])): 
+0

благодарит за anwser - не было пока не назовут ноты) –

+0

Добро пожаловать :) –

0

Давайте сначала построить вспомогательный генератор, который выполняет следующие действия:

from itertools import izip, tee, ifilter 

def sparsed_window(iterator, elements=2, step=1): 
    its = tee(iterator, elements) 
    for i,it in enumerate(its): 
     for _ in range(i*step): 
      next(it,None) # wind forward each iterator for the needed number of items 

    return izip(*its) 

print list(sparsed_window([1,2,3,4,5,6,7,8,9,10],3,2)) 

Выход:

>>> 
[(1, 3, 5), (2, 4, 6), (3, 5, 7), (4, 6, 8), (5, 7, 9), (6, 8, 10)] 

Этот помощник избегает нас создания почти одинаковые списки в памяти. Он использует tee для умного кеша только той части, которая необходима.

Хелпер код основан на pairwise recipe

Тогда мы можем использовать этот помощник, чтобы получить то, что мы хотим:

def find_instance(iterator, hz=1): 
    iterated_in_sparsed_window = sparsed_window(iterator, elements=3, step=hz) 
    fitting_values = ifilter(lambda (i,els): all(el<0.5 for el in els), enumerate(iterated_in_sparsed_window)) 
    i, first_fitting = next(fitting_values, (None,None)) 
    return i 

print find_instance([1,0.4,1,0.4,1,0.4,1,0.4,1], hz=2) 

Выход:

>>> 
1