在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)
使用切片[:-1]
将产生“紧接”超过阈值之前的索引(您可以在图表中看到)。如果您希望索引“紧接着”使用[1:]
而不是[:-1]
以上是关于在Python中实现阈值检测功能的主要内容,如果未能解决你的问题,请参考以下文章