在阵列中找到几个感兴趣的区域

时间:2014-03-16 18:50:30

标签: python arrays analysis region threshold

假设我已经进行了一项实验,我已经将python程序运行了很长时间,在那段时间里,我已经对一些数量的测量进行了多次测量。每个测量值在1到3秒之间用一些值分开,时间步长比那个小得多......比如0.01s。即使您只是采用y轴,这样的一个示例可能如下所示:

[...0,1,-1,4,1,0,0,2,3,1,0,-1,2,3,5,7,8,17,21,8,3,1,0,0,-2,-17,-20,-10,-3,3,1,0,-2,-1,1,0,0,1,-1,0,0,2,0...]

在这里,我们有一段时间不活动,然后是急剧上升,下跌,短暂停顿在0附近,急剧下跌,急剧上升并再次在0附近稳定。这些点表明这是长期数据流的一部分。两个方向。在整个数据集中将存在许多这些事件,其长度由低幅度区域分隔。

我希望基本上形成一个' n' array s(tuple s?)具有不同的长度,仅捕获事件,因此我可以稍后单独分析它们。我不能纯粹用np.absolute()类型阈值分开,因为在给定事件中偶尔存在接近零值的小区域,例如在上面的示例中。除此之外,在具有大幅度但持续时间短的测量之间可能偶尔会出现间隙。

理想情况下,上面的样本最终会与平面区域左右两个元素一样左右。

[0,-1,2,3,5,7,8,17,21,8,3,1,0,0,-2,-17,-20,-10,-3,3,1,0,-2,-1]

我想的是:

输入:

[0,1,0,0,-1,4,8,22,16,7,2,1,0,-1,-17,-20,-6,-1,0,1,0,2,1,0,8,-7,-1,0,0,1,0,1,-1,-17,-22,-40,16,1,3,14,17,19,8,2,0,1,3,2,3,1,0,0,-2,1,0,0,-1,22,4,0,-1,0]

基于某些数量小于2的连续值进行拆分。

[[-1,4,8,22,16,7,2,1,0,-1,-17,-20,-6,-1],[8,-7,-1,0],[-1,-17,-22,-40,16,1,3,14,17,19,8,2,0],[1,22,4,]]

如下图所示:

enter image description here

如果子数组长度小于10,则删除:

[[-1,4,8,22,16,7,2,1,0,-1,-17,-20,-6,-1],[-1,-17,-22,-40,16,1,3,14,17,19,8,2,0]]

这是接近它的好方法吗?第一步也让我感到困惑。我还需要在事件中保留那些小的低幅度区域。

重新编辑!我将比较两个信号作为时间的函数进行比较,以便将它们压缩在一个元组列表中。

1 个答案:

答案 0 :(得分:1)

这是我的两分钱,基于指数平滑。

import itertools
A=np.array([0,1,0,0,-1,4,8,22,16,7,2,1,0,-1,-17,-20,-6,-1,0,1,0,2,1,0,8,-7,-1,0,0,1,0,1,-1,-17,-22,-40,16,1,3,14,17,19,8,2,0,1,3,2,3,1,0,0,-2,1,0,0,-1,22,4,0,-1,0])
B=np.hstack(([0,0],A,[0,0]))
B=np.asanyarray(zip(*[B[i:] for i in range(5)]))
C=(B*[0.25,0.5,1,0.5,0.25]).mean(axis=1) #C is the 5-element sliding windows exponentially smoothed signal
D=[]
for item in itertools.groupby(enumerate(C), lambda x: abs(x[1])>1.5): 
    if item[0]:
        D.append(list(item[1])) #Get the indices where the signal are of magnitude >2. Change 1.5 to control the behavior.
E=[D[0]]
for item in D[1:]:
    if (item[0][0]-E[-1][-1][0]) <5: #Merge interesting regions if they are 5 or less indices apart. Change 5 to control the behavior.
        E[-1]=E[-1]+item
    else:
        E.append(item)
print [(item[0][0], item[-1][0]) for item in E]
[A[item[0][0]: item[-1][0]] for item in E if (item[-1][0]-item[0][0])>9] #Filter out the interesting regions <10 in length.

enter image description here