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序列

有尖峰的信号。

heightNumber或ndarray或Sequence,可选

所需的山峰高度。要么是一个数字, None ,数组匹配 x 或前者的2元组序列。第一个元素始终被解释为最小高度,第二个元素(如果提供)被解释为所需的最大高度。

thresholdNumber或ndarray或Sequence,可选

所需的峰值阈值,与其相邻样本的垂直距离。要么是一个数字, None ,数组匹配 x 或前者的2元组序列。第一个元素始终被解释为最小,第二个元素(如果提供)被解释为所需的最大阈值。

distance数字,可选

相邻峰之间样品所需的最小水平距离(>=1)。首先移除较小的峰值,直到满足所有剩余峰值的条件。

prominenceNumber或ndarray或Sequence,可选

需要突出山峰。要么是一个数字, None ,数组匹配 x 或前者的2元组序列。第一个元素总是被解释为最小的,第二个元素(如果提供)被解释为所需的最大突出度。

widthNumber或ndarray或Sequence,可选

样品中所需的峰宽度。要么是一个数字, None ,数组匹配 x 或前者的2元组序列。第一个元素始终被解释为最小宽度,第二个元素(如果提供)被解释为所需的最大宽度。

wlen整型,可选

用于计算峰顶日珥,因此它仅在下列参数之一时使用 prominencewidth 给出了。请参阅参数 wlen 在……里面 peak_prominences 获取其影响的完整描述。

rel_height浮动,可选

用于计算峰值宽度,因此它仅在以下情况下使用 width 给出了。请参阅参数 rel_height 在……里面 peak_widths 获取其影响的完整描述。

plateau_sizeNumber或ndarray或Sequence,可选

样品中峰的平顶所需的大小。要么是一个数字, None ,数组匹配 x 或前者的2元组序列。第一个元素始终被解释为最小元素,第二个元素(如果提供为所需的最大平台大小)始终被解释为最小。

1.2.0 新版功能.

退货
peaksndarray

中峰值的指数 x 满足所有给定条件的。

propertiesDICT

包含在评估指定条件期间作为中间结果计算的返回峰的属性的字典:

  • 'peak_heights'

    如果 height 给定的情况下,每个峰的高度 x

  • ‘Left_Thresholds’,‘Right_Thresholds’

    如果 threshold 则这些关键字包含与其相邻样本垂直距离的峰值。

  • ‘突出’,‘右_基’,‘左_基’

    如果 prominence 则这些密钥是可访问的。看见 peak_prominences 获取其内容的描述。

  • ‘width_heights’,‘Left_ips’,‘right_ips’

    如果 width 则这些密钥是可访问的。看见 peak_widths 获取其内容的描述。

  • ‘Platform_Size’,Left_Edges‘,’Right_Edges‘

    如果 plateau_size 则这些键是可访问的,并且包含峰值边缘的索引(边缘仍然是平台的一部分)和计算出的平台大小。

    1.2.0 新版功能.

要在不排除峰值的情况下计算和返回属性,请提供开放间隔 (None, None) 作为相应参数的值(不包括 distance )。

警告
PeakPropertyWarning

如果峰值的属性具有意外的值,则引发此异常(请参见 peak_prominencespeak_widths )。

警告

对于包含NAN的数据,此函数可能会返回意外结果。要避免这种情况,应卸下或更换NAN。

参见

find_peaks_cwt

用小波变换找峰。

peak_prominences

直接计算峰顶的显著性。

peak_widths

直接计算峰宽。

注意事项

在该函数的上下文中,峰值或局部最大值被定义为两个直接相邻的具有较小幅度的任何样本。对于平坦的峰值(多个等幅宽的样本),返回中间样本的索引(如果样本数量为偶数,则向下舍入)。对于有噪声的信号,峰值位置可以关闭,因为噪声可能会改变局部最大值的位置。在这些情况下,请考虑在搜索峰值之前平滑信号或使用其他峰值查找和拟合方法(如 find_peaks_cwt )。

有关指定条件的一些附加注释:

  • 几乎所有条件(不包括 distance )可以作为半开或闭合间隔给出,例如, 1(1, None) 定义半开间隔 \([1, \infty]\) 而当 (None, 1) 定义间隔 \([-\infty, 1]\) 。开场间隔 (None, None) 也可以指定,它返回匹配属性而不排除峰值。

  • 边界始终包括在用于选择有效峰值的间隔中。

  • 对于几种情况,可以使用数组匹配来指定间隔边界 x 在形状上,该形状允许基于样本位置的动态约束。

  • 按以下顺序评估条件: plateau_sizeheightthresholddistanceprominencewidth 。在大多数情况下,此顺序是最快的顺序,因为首先应用较快的操作,以减少需要稍后评估的峰值数量。

  • 而索引位于 peaks 保证至少是 distance 样品分开时,平峰的边缘可能比允许的更近 distance

  • 使用 wlen 要缩短评估条件所需的时间,请执行以下操作 prominencewidth 如果 x 较大或有许多局部最大值(请参见 peak_prominences )。

1.1.0 新版功能.

示例

为了演示此函数的用法,我们使用一个信号 x 随SciPy一起提供(请参见 scipy.misc.electrocardiogram )。让我们找出所有的峰值(局部最大值) x 其振幅在0以上。

>>> import matplotlib.pyplot as plt
>>> from scipy.misc 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()
../../_images/scipy-signal-find_peaks-1_00_00.png

我们可以使用以下命令选择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()
../../_images/scipy-signal-find_peaks-1_01_00.png

对于周期信号,另一个有用的条件可以用 distance 论点。在这种情况下,我们可以通过要求至少150个样本的距离来容易地选择QRS波群在心电图(ECG)中的位置。

>>> 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()
../../_images/scipy-signal-find_peaks-1_02_00.png

特别是对于有噪声的信号,可以很容易地根据它们的显著程度对峰进行分组(请参见 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()
../../_images/scipy-signal-find_peaks-1_03_00.png

最后,让我们检查ECG的不同部分,它包含不同形状的搏动形式。为了只选择不典型的心跳,我们结合了两个条件:最小突出度为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()
../../_images/scipy-signal-find_peaks-1_04_00.png