scipy.signal.

find_peaks#

scipy.signal.find_peaks(x, height=None, порог=None, расстояние=None, выступ=None, ширина=None, wlen=None, rel_height=0.5, plateau_size=None)[источник]#

Найти пики внутри сигнала на основе свойств пиков.

Эта функция принимает одномерный массив и находит все локальные максимумы путем простого сравнения соседних значений. При необходимости можно выбрать подмножество этих пиков, указав условия для свойств пика.

Параметры:
xпоследовательность

Сигнал с пиками.

heightчисло или ndarray или последовательность, необязательно

Требуемая высота пиков. Либо число, None, массив, соответствующий x или 2-элементная последовательность из предыдущего. Первый элемент всегда интерпретируется как минимальная, а второй, если предоставлен, как максимальная требуемая высота.

порогчисло или ndarray или последовательность, необязательно

Требуемый порог пиков — вертикальное расстояние до соседних отсчетов. Либо число, None, массив, соответствующий x или 2-элементная последовательность первого. Первый элемент всегда интерпретируется как минимальный, а второй, если предоставлен, как максимальный требуемый порог.

расстояниечисло, опционально

Требуемое минимальное горизонтальное расстояние (>= 1) в выборках между соседними пиками. Меньшие пики удаляются первыми, пока условие не будет выполнено для всех оставшихся пиков.

выступчисло или ndarray или последовательность, необязательно

Требуемая значимость пиков. Либо число, None, массив, соответствующий x или 2-элементная последовательность из предыдущего. Первый элемент всегда интерпретируется как минимальная, а второй, если предоставлен, как максимальная требуемая значимость.

шириначисло или ndarray или последовательность, необязательно

Требуемая ширина пиков в выборках. Либо число, None, массив, соответствующий x или 2-элементная последовательность из предыдущего. Первый элемент всегда интерпретируется как минимальная, а второй, если предоставлен, как максимальная требуемая ширина.

wlenint, необязательный

Используется для вычисления выдающихся пиков, поэтому используется только если один из аргументов выступ или ширина указан. См. аргумент wlen в peak_prominences для полного описания его эффектов.

rel_heightfloat, опционально

Используется для вычисления ширины пиков, поэтому применяется только если ширина указан. См. аргумент rel_height в peak_widths для полного описания его эффектов.

plateau_sizeчисло или ndarray или последовательность, необязательно

Требуемый размер плоской вершины пиков в выборках. Либо число, None, массив, соответствующий x или последовательность из 2 элементов первого типа. Первый элемент всегда интерпретируется как минимальный, а второй, если предоставлен, как максимальный требуемый размер плато.

Добавлено в версии 1.2.0.

Возвращает:
пикиndarray

Индексы пиков в x которые удовлетворяют всем заданным условиям.

свойствdict

Словарь, содержащий свойства возвращенных пиков, которые были вычислены как промежуточные результаты при оценке указанных условий:

  • 'peak_heights'

    Если height задано, высота каждого пика в x.

  • ‘left_thresholds’, ‘right_thresholds’

    Если порог заданы, эти ключи содержат вертикальное расстояние пиков до соседних выборок.

  • 'prominences', 'right_bases', 'left_bases'

    Если выступ если задано, эти ключи доступны. См. peak_prominences для описания их содержания.

  • 'widths', 'width_heights', 'left_ips', 'right_ips'

    Если ширина если задано, эти ключи доступны. См. peak_widths для описания их содержания.

  • 'plateau_sizes', left_edges', 'right_edges'

    Если plateau_size задано, эти ключи доступны и содержат индексы границ пика (границы всё ещё являются частью плато) и вычисленные размеры плато.

    Добавлено в версии 1.2.0.

Чтобы вычислить и вернуть свойства без исключения пиков, предоставьте открытый интервал (None, None) в качестве значения соответствующему аргументу (исключая расстояние).

Предупреждает:
PeakPropertyWarning

Вызывается, если свойства пика имеют неожиданные значения (см. peak_prominences и peak_widths).

Предупреждение

Эта функция может возвращать неожиданные результаты для данных, содержащих NaN. Чтобы избежать этого, NaN следует либо удалить, либо заменить.

Смотрите также

find_peaks_cwt

Найти пики с использованием вейвлет-преобразования.

peak_prominences

Непосредственно вычислить значимость пиков.

peak_widths

Прямой расчет ширины пиков.

Примечания

В контексте этой функции пик или локальный максимум определяется как любой отсчет, два соседних отсчета которого имеют меньшую амплитуду. Для плоских пиков (более одного отсчета одинаковой амплитуды) возвращается индекс среднего отсчета (округленный в меньшую сторону, если количество отсчетов четное). Для зашумленных сигналов местоположения пиков могут быть смещены, так как шум может изменить положение локальных максимумов. В таких случаях рассмотрите сглаживание сигнала перед поиском пиков или используйте другие методы поиска и подгонки пиков (как find_peaks_cwt).

Некоторые дополнительные комментарии по указанию условий:

  • Почти все условия (исключая расстояние) могут быть заданы как полуоткрытые или закрытые интервалы, например, 1 или (1, None) определяет полуоткрытый интервал \([1, \infty]\) в то время как (None, 1) определяет интервал \([-\infty, 1]\). Открытый интервал (None, None) также может быть указан, что возвращает соответствующие свойства без исключения пиков.

  • Граница всегда включается в интервал, используемый для выбора допустимых пиков.

  • Для нескольких условий границы интервала могут быть указаны с помощью массивов, соответствующих x в форме, что позволяет динамические ограничения на основе позиции выборки.

  • Условия оцениваются в следующем порядке: plateau_size, height, порог, расстояние, выступ, ширина. В большинстве случаев этот порядок является самым быстрым, потому что более быстрые операции применяются первыми, чтобы уменьшить количество пиков, которые нужно оценить позже.

  • В то время как индексы в пики гарантированно не менее расстояние образцы раздельно, края плоских пиков могут быть ближе, чем допустимо расстояние.

  • Используйте wlen чтобы сократить время оценки условий для выступ или ширина if x велика или имеет много локальных максимумов (см. peak_prominences).

Добавлено в версии 1.1.0.

Примеры

Для демонстрации использования этой функции мы используем сигнал 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()
../../_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

Ещё одно полезное условие для периодических сигналов может быть задано с помощью расстояние аргумент. В этом случае мы можем легко выбрать позиции комплексов QRS в электрокардиограмме (ЭКГ), требуя расстояние не менее 150 отсчетов.

>>> 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). Например, мы можем выбрать все пики, кроме упомянутых QRS-комплексов, ограничив допустимую значимость до 0.6.

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

И, наконец, рассмотрим другой участок ЭКГ, содержащий формы ударов разной формы. Чтобы выбрать только атипичные сердечные удары, мы объединяем два условия: минимальная высота 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