本文简要介绍 python 语言中 scipy.signal.peak_prominences
的用法。
用法:
scipy.signal.peak_prominences(x, peaks, wlen=None)#
计算信号中每个峰值的突出度。
峰的突出度衡量峰与信号周围基线的突出程度,并定义为峰与其最低轮廓线之间的垂直距离。
- x: 序列
带有峰值的信号。
- peaks: 序列
x 中的峰值索引。
- wlen: 整数,可选
样本中的窗口长度,可选择将每个峰的评估区域限制为 x 的子集。峰值始终位于窗口的中间,因此给定长度向上舍入到下一个奇数。该参数可以加快计算速度(见注释)。
- prominences: ndarray
峰中每个峰的计算突出。
- left_bases, right_bases: ndarray
峰的基数作为每个峰左侧和右侧的 x 中的索引。每对的较高基数是峰的最低等高线。
- ValueError
如果 peaks 中的值是 x 的无效索引。
- PeakPropertyWarning
对于不指向 x 中有效局部最大值的峰值索引,返回的突出度将为 0,并引发此警告。如果 wlen 小于峰的平台大小,也会发生这种情况。
参数 ::
返回 ::
抛出 ::
警告 ::
警告
对于包含 NaN 的数据,此函数可能会返回意外结果。为了避免这种情况,应该删除或替换NaNs。
注意:
计算峰值突出度的策略:
从当前峰值向左和向右延伸一条水平线,直到该线到达窗口边界(参见 wlen)或在更高峰值的斜率处再次与信号相交。具有相同高度的峰的交点将被忽略。
在每一边找到上面定义的区间内的最小信号值。这些点是峰的基础。
两个碱基中较高的一个标记了峰的最低轮廓线。然后可以将突出度计算为峰高本身与其最低轮廓线之间的垂直差。
对于具有周期性行为的大 x,搜索峰值的基数可能会很慢,因为需要为第一个算法步骤评估大块甚至整个信号。该评估区域可以通过参数 wlen 进行限制,该参数将算法限制在当前峰值周围的窗口,并且如果窗口长度相对于 x 较短,则可以缩短计算时间。但是,如果峰的真实碱基在此窗口之外,这可能会阻止算法找到真实的全局轮廓线。相反,在受限窗口内发现了更高的等高线,导致计算出的突出度更小。实际上,这仅与 x 中的最高峰值集相关。这种行为甚至可以被有意用于计算“local” 突出。
参考:
[1]维基百科关于地形突出的文章:https://en.wikipedia.org/wiki/Topographic_prominence
例子:
>>> import numpy as np >>> from scipy.signal import find_peaks, peak_prominences >>> import matplotlib.pyplot as plt
创建具有两个重叠谐波的测试信号
>>> x = np.linspace(0, 6 * np.pi, 1000) >>> x = np.sin(x) + 0.6 * np.sin(2.6 * x)
查找所有峰并计算突出度
>>> peaks, _ = find_peaks(x) >>> prominences = peak_prominences(x, peaks)[0] >>> prominences array([1.24159486, 0.47840168, 0.28470524, 3.10716793, 0.284603 , 0.47822491, 2.48340261, 0.47822491])
计算每个峰的轮廓线的高度并绘制结果
>>> contour_heights = x[peaks] - prominences >>> plt.plot(x) >>> plt.plot(peaks, x[peaks], "x") >>> plt.vlines(x=peaks, ymin=contour_heights, ymax=x[peaks]) >>> plt.show()
让我们评估第二个示例,该示例演示索引 5 处的一个峰值的几种边情况。
>>> x = np.array([0, 1, 0, 3, 1, 3, 0, 4, 0]) >>> peaks = np.array([5]) >>> plt.plot(x) >>> plt.plot(peaks, x[peaks], "x") >>> plt.show()
>>> peak_prominences(x, peaks) # -> (prominences, left_bases, right_bases) (array([3.]), array([2]), array([6]))
请注意,在搜索左基时,相同高度的索引 3 处的峰值如何不被视为边界。相反,在 0 和 2 处找到两个最小值,在这种情况下,总是选择更接近评估峰值的那个。然而,在右侧,碱基必须放置在 6 处,因为较高的峰代表评估区域的右边界。
>>> peak_prominences(x, peaks, wlen=3.1) (array([2.]), array([4]), array([6]))
在这里,我们将算法限制在从 3 到 7 的窗口(长度为 5 个样本,因为 wlen 被四舍五入到下一个奇数整数)。因此,评估区域中仅有的两个候选是两个相邻样本,并且计算出较小的突出度。
相关用法
- Python SciPy signal.peak_widths用法及代码示例
- Python SciPy signal.periodogram用法及代码示例
- Python SciPy signal.place_poles用法及代码示例
- Python SciPy signal.czt_points用法及代码示例
- Python SciPy signal.chirp用法及代码示例
- Python SciPy signal.residue用法及代码示例
- Python SciPy signal.iirdesign用法及代码示例
- Python SciPy signal.max_len_seq用法及代码示例
- Python SciPy signal.kaiser_atten用法及代码示例
- Python SciPy signal.oaconvolve用法及代码示例
- Python SciPy signal.hilbert用法及代码示例
- Python SciPy signal.ricker用法及代码示例
- Python SciPy signal.group_delay用法及代码示例
- Python SciPy signal.cheb2ord用法及代码示例
- Python SciPy signal.get_window用法及代码示例
- Python SciPy signal.lfilter用法及代码示例
- Python SciPy signal.morlet用法及代码示例
- Python SciPy signal.coherence用法及代码示例
- Python SciPy signal.dfreqresp用法及代码示例
- Python SciPy signal.TransferFunction用法及代码示例
- Python SciPy signal.dbode用法及代码示例
- Python SciPy signal.residuez用法及代码示例
- Python SciPy signal.bilinear_zpk用法及代码示例
- Python SciPy signal.firls用法及代码示例
- Python SciPy signal.impulse用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.signal.peak_prominences。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。