scipy.signal.peak_prominences¶
- scipy.signal.peak_prominences(x, peaks, wlen=None)[源代码]¶
计算信号中每个峰值的显著程度。
峰的突出度衡量峰与周围信号基线的突出程度,定义为峰与其最低轮廓线之间的垂直距离。
- 参数
- x序列
有尖峰的信号。
- peaks序列
中峰值的指数 x 。
- wlen整型,可选
以样本为单位的窗口长度,可选地将每个峰值的评估区域限制为 x 。峰值总是放在窗口的中间,因此给定的长度向上舍入为下一个奇数。此参数可以加快计算速度(请参阅备注)。
- 退货
- prominencesndarray
计算出的每个峰的日珥 peaks 。
- left_bases, right_basesndarray
作为指数的峰的底数 x 在每个山峰的左边和右边。每一对的较高底面是一个山峰的最低等高线。
- 加薪
- ValueError
如果中的值 peaks 是的无效索引 x 。
- 警告
- PeakPropertyWarning
对于中的索引 peaks 中没有指向有效局部最大值的 x ,则返回的突出度将为0,并引发此警告。在以下情况下也会发生这种情况 wlen 比山峰的高原大小要小。
警告
对于包含NAN的数据,此函数可能会返回意外结果。要避免这种情况,应卸下或更换NAN。
参见
find_peaks
根据峰值属性查找信号内部的峰值。
peak_widths
计算山峰的宽度。
注意事项
计算山峰突出度的策略:
从当前峰值向左和向右延伸一条水平线,直到该线到达窗口边框(请参见 wlen )或在较高峰值的斜率处再次与信号相交。具有相同高度的峰值的交叉点将被忽略。
在每一侧,找出上述定义的间隔内的最小信号值。这些点就是山峰的底座。
两个底面中较高的一个标志着山峰的最低等高线。然后,日珥可以通过山峰高度本身与其最低等高线之间的垂直差来计算。
搜索山峰的底座对于大型山峰来说可能会很慢 x 具有周期性行为,因为第一个算法步骤需要评估大块甚至整个信号。该评估区域可以用参数来限制 wlen 其将算法限制在当前峰值附近的窗口,并且如果窗口长度相对于以下各项而言较短,则可以缩短计算时间 x 。但是,如果峰值的真实底数在此窗口之外,这可能会使算法无法找到真实的全局轮廓线。取而代之的是,在受限窗口内发现较高的等高线,从而导致较小的计算日珥。实际上,这只与中最高的一组峰值相关 x 。这种行为甚至可能被故意用来计算“局部”日珥。
1.1.0 新版功能.
参考文献
- 1
维基百科关于地形日珥的文章:https://en.wikipedia.org/wiki/Topographic_prominence
示例
>>> 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 向上舍入为下一个奇数)。因此,评估区域中仅有的两个候选样本是相邻的两个样本,并计算出较小的日珥。