在Python中实现阈值检测功能

问题描述 投票:1回答:1

我想在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循环或者不需要为上行或下行交叉编写单独的代码。

python numpy
1个回答
1
投票

您可以使用两个掩码:第一个分隔低于和高于阈值的值,第二个使用第一个掩码上的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]

© www.soinside.com 2019 - 2024. All rights reserved.