【问题标题】:Finding several regions of interest in an array在数组中查找多个感兴趣区域
【发布时间】:2014-03-18 01:34:24
【问题描述】:

假设我进行了一个实验,我让一个 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' arrays (tuples?) 组成的数组,它们的长度各不相同,仅捕获事件,以便我以后可以单独分析它们。我不能纯粹通过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,]]

如下图所示:

如果子数组长度小于 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 帮我编辑问题=]
  • 不客气。不应该根据您的规则将结果list 中的第一个子list 拆分为2,1,0,-11,0,-1
  • 不,这将是 0 值中间事件的示例。可以将每个事件视为正弦波的单个噪声振荡......之间有大的零(ish)区域。
  • 不要插入我自己的答案,但听起来你正在描述类似的东西? stackoverflow.com/a/4360778/325565
  • @CTZhu 谢谢你的图片!这是一个很好的例子 =] 到目前为止,我已经看到了一个元素 i 并且如果 sum(abs(A[i],[i+len_threshold)))

标签: python arrays analysis region threshold


【解决方案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.

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 2012-02-22
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2018-08-15
    相关资源
    最近更新 更多