本文簡要介紹 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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。