本文简要介绍 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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。