本文簡要介紹 python 語言中 scipy.signal.find_peaks
的用法。
用法:
scipy.signal.find_peaks(x, height=None, threshold=None, distance=None, prominence=None, width=None, wlen=None, rel_height=0.5, plateau_size=None)#
根據峰值屬性查找信號內部的峰值。
此函數采用一維數組並通過簡單比較相鄰值來找到所有局部最大值。或者,可以通過指定峰屬性的條件來選擇這些峰的子集。
- x: 序列
帶有峰值的信號。
- height: 數字或ndarray或序列,可選
所需的峰高。無論是數字,
None
, 一個數組匹配x或前者的 2 元素序列。第一個元素始終被解釋為最小高度,第二個元素(如果提供)被解釋為最大所需高度。- threshold: 數字或ndarray或序列,可選
所需的峰值閾值,與其相鄰樣本的垂直距離。無論是數字,
None
, 一個數組匹配x或前者的 2 元素序列。第一個元素始終被解釋為最小值,第二個元素(如果提供)被解釋為所需的最大閾值。- distance: 編號,可選
相鄰峰之間的樣本中所需的最小水平距離 (>= 1)。首先移除較小的峰,直到滿足所有剩餘峰的條件。
- prominence: 數字或ndarray或序列,可選
所需的峰突出。無論是數字,
None
, 一個數組匹配x或前者的 2 元素序列。第一個元素總是被解釋為最小的,第二個(如果提供的話)被解釋為最大的所需突出。- width: 數字或ndarray或序列,可選
樣品中所需的峰寬。無論是數字,
None
, 一個數組匹配x或前者的 2 元素序列。第一個元素始終被解釋為最小寬度,第二個元素(如果提供)被解釋為最大所需寬度。- wlen: 整數,可選
用於計算峰值突出,因此僅在參數之一時使用突出或者寬度給出。見參數威倫在scipy.signal.peak_prominences了解其效果的完整說明。
- rel_height: 浮點數,可選
用於計算峰寬,因此僅在以下情況下使用寬度給出。見參數rel_height在scipy.signal.peak_widths了解其效果的完整說明。
- plateau_size: 數字或ndarray或序列,可選
樣品中峰的平頂大小。無論是數字,
None
, 一個數組匹配x或前者的 2 元素序列。第一個元素總是被解釋為最小的,而第二個元素,如果提供為最大所需的平台大小。
- peaks: ndarray
x 中滿足所有給定條件的峰的索引。
- properties: dict
包含在評估指定條件期間作為中間結果計算的返回峰的屬性的字典:
- ‘peak_heights’
如果給定高度,則為 x 中每個峰的高度。
- ‘left_thresholds’, ‘right_thresholds’
如果給定閾值,則這些鍵包含與其相鄰樣本的峰值垂直距離。
- ‘prominences’, ‘right_bases’、‘left_bases’
如果突出給出,這些鍵是可訪問的。看scipy.signal.peak_prominences了解其內容的說明。
- ‘width_heights’, ‘left_ips’、‘right_ips’
如果寬度給出,這些鍵是可訪問的。看scipy.signal.peak_widths了解其內容的說明。
- ‘plateau_sizes’、left_edges'、‘right_edges’
如果給出plateau_size,則這些鍵是可訪問的,並且包含峰值邊的索引(邊仍然是高原的一部分)和計算的高原大小。
要在不排除峰值的情況下計算和返回屬性,請提供開區間
(None, None)
作為適當參數的值(不包括距離)。
- PeakPropertyWarning
如果峰的屬性具有意外值,則引發(請參閱
peak_prominences
和peak_widths
)。
參數 ::
返回 ::
警告 ::
警告
對於包含 NaN 的數據,此函數可能會返回意外結果。為了避免這種情況,應該刪除或替換NaNs。
注意:
在此函數的上下文中,峰值或局部最大值被定義為兩個直接鄰居具有較小幅度的任何樣本。對於平坦的峰值(多於一個等幅寬的樣本),返回中間樣本的索引(如果樣本數為偶數,則向下舍入)。對於噪聲信號,峰值位置可能會關閉,因為噪聲可能會改變局部最大值的位置。在這些情況下,請考慮在搜索峰值之前平滑信號或使用其他峰值查找和擬合方法(如
find_peaks_cwt
)。關於指定條件的一些附加評論:
幾乎所有條件(不包括距離) 可以作為半開或閉區間給出,例如,
1
或者(1, None)
定義半開區間 盡管(None, 1)
定義區間 .開區間(None, None)
也可以指定,它返回匹配屬性而不排除峰值。邊界始終包含在用於選擇有效峰的區間中。
對於幾個條件,可以使用與 x 形狀匹配的數組來指定區間邊界,這可以根據樣本位置進行動態約束。
按以下順序評估條件:plateau_size、高度、閾值、距離、突出度、寬度。在大多數情況下,此順序是最快的順序,因為首先應用更快的操作以減少稍後需要評估的峰值數量。
雖然峰值中的索引保證至少相距樣本距離,但平坦峰值的邊可能比允許的距離更近。
采用威倫減少評估條件所需的時間突出或者寬度如果x很大或有很多局部最大值(見scipy.signal.peak_prominences)。
例子:
為了演示這個函數的用法,我們使用一個信號x隨 SciPy 提供(見
scipy.datasets.electrocardiogram
)。讓我們找到所有的峰值(局部最大值)x其幅度大於 0。>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy.datasets import electrocardiogram >>> from scipy.signal import find_peaks >>> x = electrocardiogram()[2000:4000] >>> peaks, _ = find_peaks(x, height=0) >>> plt.plot(x) >>> plt.plot(peaks, x[peaks], "x") >>> plt.plot(np.zeros_like(x), "--", color="gray") >>> plt.show()
我們可以選擇低於 0 的峰值
height=(None, 0)
或使用數組匹配x大小以反映信號不同部分的變化情況。>>> border = np.sin(np.linspace(0, 3 * np.pi, x.size)) >>> peaks, _ = find_peaks(x, height=(-border, border)) >>> plt.plot(x) >>> plt.plot(-border, "--", color="gray") >>> plt.plot(border, ":", color="gray") >>> plt.plot(peaks, x[peaks], "x") >>> plt.show()
可以使用距離參數給出周期信號的另一個有用條件。在這種情況下,我們可以通過要求至少 150 個樣本的距離輕鬆選擇心電圖 (ECG) 中 QRS 波群的位置。
>>> peaks, _ = find_peaks(x, distance=150) >>> np.diff(peaks) array([186, 180, 177, 171, 177, 169, 167, 164, 158, 162, 172]) >>> plt.plot(x) >>> plt.plot(peaks, x[peaks], "x") >>> plt.show()
特別是對於噪聲信號,峰值可以很容易地按其突出程度進行分組(參見
peak_prominences
)。例如,我們可以通過將允許的突出度限製為 0.6 來選擇除上述 QRS 複合波之外的所有峰。>>> peaks, properties = find_peaks(x, prominence=(None, 0.6)) >>> properties["prominences"].max() 0.5049999999999999 >>> plt.plot(x) >>> plt.plot(peaks, x[peaks], "x") >>> plt.show()
最後,讓我們檢查心電圖的不同部分,其中包含不同形狀的搏動形式。為了僅選擇非典型心跳,我們結合了兩個條件:最小突出 1 和至少 20 個樣本的寬度。
>>> x = electrocardiogram()[17000:18000] >>> peaks, properties = find_peaks(x, prominence=1, width=20) >>> properties["prominences"], properties["widths"] (array([1.495, 2.3 ]), array([36.93773946, 39.32723577])) >>> plt.plot(x) >>> plt.plot(peaks, x[peaks], "x") >>> plt.vlines(x=peaks, ymin=x[peaks] - properties["prominences"], ... ymax = x[peaks], color = "C1") >>> plt.hlines(y=properties["width_heights"], xmin=properties["left_ips"], ... xmax=properties["right_ips"], color = "C1") >>> plt.show()
相關用法
- Python SciPy signal.find_peaks_cwt用法及代碼示例
- Python SciPy signal.findfreqs用法及代碼示例
- Python SciPy signal.firls用法及代碼示例
- Python SciPy signal.filtfilt用法及代碼示例
- Python SciPy signal.firwin用法及代碼示例
- Python SciPy signal.firwin2用法及代碼示例
- Python SciPy signal.freqs用法及代碼示例
- Python SciPy signal.freqs_zpk用法及代碼示例
- Python SciPy signal.freqz用法及代碼示例
- Python SciPy signal.freqresp用法及代碼示例
- Python SciPy signal.fftconvolve用法及代碼示例
- Python SciPy signal.freqz_zpk用法及代碼示例
- 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用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.signal.find_peaks。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。