【发布时间】:2019-10-09 17:44:36
【问题描述】:
对于数据分析任务,我想在一个 numpy 数组中找到零交叉点,该数组来自一个卷积,首先是一个类似 sobel 的内核,然后是一个墨西哥帽子内核。零交叉让我能够检测数据中的边缘。
不幸的是,数据有些嘈杂,我只想找到具有最小跳跃大小的零交叉点,20 在以下示例中:
import numpy as np
arr = np.array([12, 15, 9, 8, -1, 1, -12, -10, 10])
应该会导致
>>>array([1, 3, 7])
或
>>>array([3, 7])
其中3 是-1 的索引,就在第一次跳转中间之前,7 是-10 的索引
我尝试过修改以下代码(来源:Efficiently detect sign-changes in python)
zero_crossings = np.where(np.diff(np.sign(np.trunc(arr/10))))[0]
正确地忽略了小跳跃,但将零交叉点放在[1,5,7]
这样做的有效方法是什么?
最小跳跃的定义并不严格,但结果应该与我的问题相符。
编辑:澄清
arr = np.array([12, 15, 9, 8, -1, 1, -12, -10, 10])
arr_floored = np.trunc(arr/10)
>>>>np.array([10, 10, 0, 0, 0, 0, -10, -10, 10])
sgn = np.sign(arr_floored)
>>>>array([ 1, 1, 0, 0, 0, 0, -1, -1, 1])
dsgn = np.diff(sgn)
>>>>array([ 0, -1, 0, 0, 0, -1, 0, 2])
np.where(dsgn)
>>>>(array([1, 5, 7], dtype=int64),)
进一步的边缘情况:
arr = [10,9,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
应该会导致
>>> np.array([10])
还刚刚注意到:问题可能是不适定的(在数学意义上)。今天晚些时候我会澄清的。
【问题讨论】:
-
你好,你说结果应该是
array([3, 6]),但是3位置的跳转是从-1到1,所以相差不是20,这正常吗?也许更新您的问题来解释这一点?干杯 -
最后一个索引不应该是7吗?
-
是的,将编辑此内容
标签: python numpy signal-processing