对于数据分析任务,我想在一个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])
还只是注意到:问题可能是不适定的(从数学意义上来说)。我将在今天晚些时候澄清它。
最佳答案
这是一个解决方案,它给出了涉及噪声阈值的交叉点的中点,以过滤在多个数据点上施加的围绕零的潜在多个波动。它为您提供的两个示例给出了正确的答案。
但是,我做了两个假设:
ABS(start | end) >= 10
处检测交叉点,因此我使用了最小范围此条件成立的地方。注意:这不会检测到从+15到-6的过渡。
编辑:实际上,它并不总是最小范围,但是代码应该足以让您开始并根据需要进行调整。
import numpy as npimport pandas as pdarr = np.array([12, 15, 9, 8, -1, 1, -12, -10, 10])sgn = pd.Series(np.sign(np.trunc(arr/10)))trailingEdge = sgn[sgn!=0].diff()edgeIndex = np.array(trailingEdge[trailingEdge!=0].index)edgeIndex[:-1] + np.diff(edgeIndex) / 2
给出:
array([3., 7.])
和
arr = [10,9,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
给出:
array([10.])
关于python - 在numpy中找到最小跳跃零交叉点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56270327/