【发布时间】:2021-08-21 01:50:21
【问题描述】:
我正在尝试编写一个函数来检测所有上升沿 - 向量中的索引值超过某个阈值。此处描述了类似的内容:Python rising/falling edge oscilloscope-like trigger,但我想添加滞后,以便触发器不会触发,除非该值低于另一个限制。
我想出了以下代码:
import numpy as np
arr = np.linspace(-10, 10, 60)
sample_values = np.sin(arr) + 0.6 * np.sin(arr*3)
above_trigger = sample_values > 0.6
below_deadband = sample_values < 0.0
combined = 1 * above_trigger - 1 * below_deadband
现在在combined 数组中,1 的原始值高于上限,-1 的值低于下限,0 的值介于两者之间:
>>> combined
array([ 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 0, 0,
1, 1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1,
0, 0, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
1, 0, 0, 1, 1, 1, 0, -1, -1])
我的想法是使用一些聪明的函数来顺序处理这个向量,并用它们之前的任何非零值替换所有零序列。那么问题就归结为简单地找到值从-1 变为1 的位置。
我认为如果正确使用 greater 操作将实现此目的:-1 编码为 True 和 1 编码为 False:
- (
True("-1") >-1) ->True("-1") - (
True("-1") >1) ->False("1") - (
True("-1") >0) ->True("-1") - (
False("1") >-1) ->True("-1") - (
False("1") >1) ->False("1") - (
False("1") >0) ->False("1")
但结果不是我所期望的:
>>> 1 - 2 * np.greater.accumulate(combined)
array([-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1])
在这种情况下,greater 函数似乎无法正确地将布尔值与数值进行比较,即使它在用于标量或成对时工作正常:
>>> np.greater(False, -1)
True
>>> np.greater.outer(False, combined)
array([False, False, True, True, True, True, True, True, True,
True, True, False, False, False, False, False, False, False,
False, False, False, True, True, True, True, True, True,
True, True, True, False, False, False, False, False, False,
False, False, False, True, True, True, True, True, True,
True, True, True, True, False, False, False, False, False,
False, False, False, False, True, True])
这是预期的行为吗?我在这里做错了什么,有什么办法可以解决这个问题吗?
或者,也许您可以建议另一种方法来解决这个问题?
谢谢。
【问题讨论】:
标签: python numpy numpy-ufunc