在数组中寻找多个感兴趣的区域

3
我做了一个实验,运行了一个Python程序很长时间,在此期间我对一些数量随时间进行了多次测量。每次测量之间的时间间隔都在1到3秒之间,而所使用的时间步长要小得多……比如0.01秒。即使只看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'个数组(元组?)的数组,每个数组捕获一个事件,以便稍后单独分析。我不能纯粹地通过类似于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]]

这是一个好的方法吗?第一步让我有点困惑。我也需要保留事件中那些低幅值的小区域。

重新编辑!我将比较两个随时间变化而测量的信号,因此它们将被压缩成一组元组。


感谢@CT Zhu帮我编辑问题 =] - user3394391
不客气。根据您的规则,您的结果列表中的第一个子“list”应该在“2,1,0,-1”或“1,0,-1”处分割,对吗? - CT Zhu
1
@CTZhu谢谢你的图片!那是一个很好的例子=]到目前为止,我已经让它查看元素i,如果sum(abs(A [i],[i + len_threshold])) <= mag_threshold * len_threshold,那么它会使A [i] ='A'...这样就不会干扰事件中间的0值。 - user3394391
  • sum(abs(range(A[i],[i+len_threshold])))
求和(abs(范围(A[i],[i+len_threshold])))
- user3394391
@JoeKington - 不确定,但继续努力吧! - user3394391
显示剩余4条评论
1个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接