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

计算山峰的宽度。

注意事项

计算山峰突出度的策略:

  1. 从当前峰值向左和向右延伸一条水平线,直到该线到达窗口边框(请参见 wlen )或在较高峰值的斜率处再次与信号相交。具有相同高度的峰值的交叉点将被忽略。

  2. 在每一侧,找出上述定义的间隔内的最小信号值。这些点就是山峰的底座。

  3. 两个底面中较高的一个标志着山峰的最低等高线。然后,日珥可以通过山峰高度本身与其最低等高线之间的垂直差来计算。

搜索山峰的底座对于大型山峰来说可能会很慢 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()
../../_images/scipy-signal-peak_prominences-1_00_00.png

让我们评估第二个示例,该示例演示了指数为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()
../../_images/scipy-signal-peak_prominences-1_01_00.png
>>> 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 向上舍入为下一个奇数)。因此,评估区域中仅有的两个候选样本是相邻的两个样本,并计算出较小的日珥。