迭代查看非连续值的数组

时间:2013-06-27 10:20:36

标签: python arrays loops compare

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

此代码遍历数组并查找满足条件'&lt; 0.5'的前3个连续值

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

我正在使用'timeseries'数据并比较t,t + 1s和t + 2s的值

如果数据以1Hz采样,那么将比较3个连续值并且上面的代码是正确的(点0,1,2)

如果数据以2Hz采样,则必须比较每个其他点(点0,2,4)或 如果数据以3Hz采样,则必须比较每个第三点(点0,3,6)

输入数据的采样率可能会有所不同,但已知并记录为变量'SRate'

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

请你帮我把'时间'纳入这个逐点分析

2 个答案:

答案 0 :(得分:1)

您可以使用扩展切片表示法,将步骤值设为SRate

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

答案 1 :(得分: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