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

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

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

我正在处理“时间序列”数据并比较 t、t+1s 和 t+2s 处的值

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

如果数据以 2Hz 采样,则必须每隔一个点进行比较(点 0、2、4),或者如果数据以 3Hz 采样,则必须每隔三个点进行比较(点 0、3、6)

输入数据的采样率可以变化,但已知并记录为变量“SRate”

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

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

4

2 回答 2

1

您可以使用扩展切片表示法,将步长值指定为SRate

for i,(x,y,z) in enumerate(zip(analysisValues, \
                               analysisValues[SRate::SRate], \
                               analysisValues[2 * SRate::SRate])):
于 2013-06-27T10:26:13.553 回答
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配方

然后我们可以使用这个助手来得到我们想要的:

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
于 2013-06-27T10:41:44.737 回答