當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy signal.peak_prominences用法及代碼示例


本文簡要介紹 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。

注意

計算峰值突出度的策略:

  1. 從當前峰值向左和向右延伸一條水平線,直到該線到達窗口邊界(參見 wlen)或在更高峰值的斜率處再次與信號相交。具有相同高度的峰的交點將被忽略。

  2. 在每一邊找到上麵定義的區間內的最小信號值。這些點是峰的基礎。

  3. 兩個堿基中較高的一個標記了峰的最低輪廓線。然後可以將突出度計算為峰高本身與其最低輪廓線之間的垂直差。

對於具有周期性行為的大 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()
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()
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 被四舍五入到下一個奇數整數)。因此,評估區域中僅有的兩個候選是兩個相鄰樣本,並且計算出較小的突出度。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.signal.peak_prominences。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。