Cri*_*ris 4 python numpy edge-detection
我正在尝试根据触发值检测 numpy 向量中的上升沿和/或下降沿。这有点像示波器触发的工作原理。
numpy 向量包含浮点值。触发器本身是一个浮点值。我希望这能像这样工作:
import numpy as np
data = np.array([-1, -0.5, 0, 0.5, 1, 1.5, 2])
trigger = rising_edge(data, 0.3)
print(trigger)
[3]
Run Code Online (Sandbox Code Playgroud)
换句话说,它会像 一样工作np.where,返回一个包含条件为真的位置的向量。
我知道我可以简单地迭代向量并获得相同的结果(这就是我正在做的),但正如您想象的那样,这并不理想。numpy 中是否有一些功能可以使用优化的 C 代码来做到这一点?或者也许在其他图书馆?
谢谢你。
因此,当我在观看有关卷积的最新 3Blue1Brown 视频时,我意识到了一种新的方法:
def rising_edge(data, thresh):
sign = data >= thresh
pos = np.where(np.convolve(sign, [1, -1]) == 1)
return pos
Run Code Online (Sandbox Code Playgroud)
因此,获取数据大于或等于阈值的所有位置,用 对其进行卷积[1, -1],然后找到卷积在上升沿返回 1 的位置。想要下降沿吗?而是寻找 -1。
非常整洁,如果我自己这么说的话。而且速度大约快 5-10%。
我们可以one-off对小于和大于的触发器进行切片和比较,就像这样 -
In [41]: data = np.array([-1, -0.5, 0, 0.5, 1, 1.5, 2, 0, 0.5])
In [43]: trigger_val = 0.3
In [44]: np.flatnonzero((data[:-1] < trigger_val) & (data[1:] > trigger_val))+1
Out[44]: array([3, 8])
Run Code Online (Sandbox Code Playgroud)
如果您还想包括相等性,即<=或>=,只需将其添加到比较中即可。
要包括上升沿和下降沿,请以另一种方式添加比较 -
In [75]: data = np.array([-1, -0.5, 0, 0.5, 1, 1.5, 2, 0.5, 0])
In [76]: trigger_val = 0.3
In [77]: mask1 = (data[:-1] < trigger_val) & (data[1:] > trigger_val)
In [78]: mask2 = (data[:-1] > trigger_val) & (data[1:] < trigger_val)
In [79]: np.flatnonzero(mask1 | mask2)+1
Out[79]: array([3, 8])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8462 次 |
| 最近记录: |