在Python中实现阈值检测功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中实现阈值检测功能相关的知识,希望对你有一定的参考价值。

我想在Python中实现以下触发器功能:

输入:

  • 时间向量t [n维numpy向量]
  • 数据向量y [n维numpy向量](值对应于t向量)
  • 阈值tr [float]
  • 阈值类型向量tr_type [m值的int值列表]

输出:

  • 阈值时间向量tr_time [m浮点值的维度列表]

功能:

我想返回tr_time,它包括精确的(首选也是插值,但尚未在下面的代码中)时间值y,其中y越过tr(交叉意味着从少到大然后或反过来)。 tr_time中的不同值对应于tr_type向量:tr_type的元素表示交叉的数量,如果这是向上或向下的交叉。例如,1表示第一次y从小于tr变为大于tr,-3表示第三次y从大于tr变为小于tr(第三次表示沿着时间向量t)

目前我有下一个代码:

import numpy as np
import matplotlib.pyplot as plt


def trigger(t, y, tr, tr_type):
    triggermarker = np.diff(1 * (y > tr))
    positiveindices = [i for i, x in enumerate(triggermarker) if x == 1]
    negativeindices = [i for i, x in enumerate(triggermarker) if x == -1]
    triggertime = []
    for i in tr_type:
        if i >= 0:
            triggertime.append(t[positiveindices[i - 1]])
        elif i < 0:
            triggertime.append(t[negativeindices[i - 1]])
    return triggertime


t = np.linspace(0, 20, 1000)
y = np.sin(t)
tr = 0.5
tr_type = [1, 2, -2]
print(trigger(t, y, tr, tr_type))
plt.plot(t, y)
plt.grid()

现在我对Python很陌生,所以我想知道是否有更多的Pythonic和更有效的方法来实现它。例如,没有for循环或者不需要为上行或下行交叉编写单独的代码。

答案

您可以使用两个掩码:第一个分隔低于和高于阈值的值,第二个使用第一个掩码上的np.diff:如果i和i + 1值都低于或高于阈值,则np.diff产生0:

import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 8 * np.pi, 400)
y = np.sin(t)
th = 0.5

mask = np.diff(1 * (y > th) != 0)
plt.plot(t, y, 'bx', markersize=3)
plt.plot(t[:-1][mask], y[:-1][mask], 'go', markersize=8)

output

使用切片[:-1]将产生“紧接”超过阈值之前的索引(您可以在图表中看到)。如果您希望索引“紧接着”使用[1:]而不是[:-1]

以上是关于在Python中实现阈值检测功能的主要内容,如果未能解决你的问题,请参考以下文章

自适应 Canny 边缘检测

看OpenCV如何在python中实现图像检测!

在片段中实现 onClickListener

在多个片段中的片段中实现选项卡

尝试在片段中实现 OnClick 侦听器 [重复]

在HAL for STM32中实现单按、长按和双按功能