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)[Quelle]#

Findet Spitzen in einem Signal basierend auf Gipfeleigenschaften.

Diese Funktion nimmt ein 1-D-Array und findet alle lokalen Maxima durch einfachen Vergleich benachbarter Werte. Optional kann eine Teilmenge dieser Peaks durch Angabe von Bedingungen für die Eigenschaften eines Peaks ausgewählt werden.

Parameter:
xSequenz

Ein Signal mit Peaks.

heightZahl oder ndarray oder Sequenz, optional

Erforderliche Höhe von Peaks. Entweder eine Zahl, None, ein Array, das mit x übereinstimmt, oder eine 2-elementige Sequenz des ersteren. Das erste Element wird immer als minimale und das zweite, falls vorhanden, als maximale erforderliche Höhe interpretiert.

thresholdZahl oder ndarray oder Sequenz, optional

Erforderlicher Schwellenwert von Peaks, der vertikale Abstand zu seinen benachbarten Abtastwerten. Entweder eine Zahl, None, ein Array, das mit x übereinstimmt, oder eine 2-elementige Sequenz des ersteren. Das erste Element wird immer als minimaler und das zweite, falls vorhanden, als maximaler erforderlicher Schwellenwert interpretiert.

distanceZahl, optional

Erforderlicher minimaler horizontaler Abstand (>= 1) in Abtastwerten zwischen benachbarten Peaks. Kleinere Peaks werden zuerst entfernt, bis die Bedingung für alle verbleibenden Peaks erfüllt ist.

prominenceZahl oder ndarray oder Sequenz, optional

Erforderliche Prominenz von Peaks. Entweder eine Zahl, None, ein Array, das mit x übereinstimmt, oder eine 2-elementige Sequenz des ersteren. Das erste Element wird immer als minimale und das zweite, falls vorhanden, als maximale erforderliche Prominenz interpretiert.

widthZahl oder ndarray oder Sequenz, optional

Erforderliche Breite von Peaks in Abtastwerten. Entweder eine Zahl, None, ein Array, das mit x übereinstimmt, oder eine 2-elementige Sequenz des ersteren. Das erste Element wird immer als minimale und das zweite, falls vorhanden, als maximale erforderliche Breite interpretiert.

wlenint, optional

Wird zur Berechnung der Prominenzen der Peaks verwendet, daher wird es nur verwendet, wenn eines der Argumente prominence oder width gegeben ist. Siehe Argument wlen in peak_prominences für eine vollständige Beschreibung seiner Auswirkungen.

rel_heightfloat, optional

Wird zur Berechnung der Breite von Peaks verwendet, daher wird es nur verwendet, wenn width gegeben ist. Siehe Argument rel_height in peak_widths für eine vollständige Beschreibung seiner Auswirkungen.

plateau_sizeZahl oder ndarray oder Sequenz, optional

Erforderliche Größe der flachen Oberseite von Peaks in Abtastwerten. Entweder eine Zahl, None, ein Array, das mit x übereinstimmt, oder eine 2-elementige Sequenz des ersteren. Das erste Element wird immer als minimale und das zweite, falls vorhanden, als maximale erforderliche Plateaugröße interpretiert.

Hinzugefügt in Version 1.2.0.

Rückgabe:
peaksndarray

Indizes der Peaks in x, die alle gegebenen Bedingungen erfüllen.

propertiesdict

Ein Wörterbuch, das die Eigenschaften der zurückgegebenen Peaks enthält, die als Zwischenergebnisse bei der Auswertung der angegebenen Bedingungen berechnet wurden.

  • ‘peak_heights’

    Wenn height angegeben ist, die Höhe jedes Peaks in x.

  • ‘left_thresholds’, ‘right_thresholds’

    Wenn threshold angegeben ist, enthalten diese Schlüssel den vertikalen Abstand eines Peaks zu seinen benachbarten Abtastwerten.

  • ‘prominences’, ‘right_bases’, ‘left_bases’

    Wenn prominence angegeben ist, sind diese Schlüssel zugänglich. Siehe peak_prominences für eine Beschreibung ihres Inhalts.

  • ‘widths’, ‘width_heights’, ‘left_ips’, ‘right_ips’

    Wenn width angegeben ist, sind diese Schlüssel zugänglich. Siehe peak_widths für eine Beschreibung ihres Inhalts.

  • ‘plateau_sizes’, left_edges’, ‘right_edges’

    Wenn plateau_size angegeben ist, sind diese Schlüssel zugänglich und enthalten die Indizes der Kanten eines Peaks (Kanten gehören noch zum Plateau) und die berechneten Plateaugrößen.

    Hinzugefügt in Version 1.2.0.

Um Eigenschaften zu berechnen und zurückzugeben, ohne Peaks auszuschließen, geben Sie das offene Intervall (None, None) als Wert für das entsprechende Argument an (ausgenommen distance).

Warnungen:
PeakPropertyWarning

Ausgelöst, wenn die Eigenschaften eines Peaks unerwartete Werte haben (siehe peak_prominences und peak_widths).

Warnung

Diese Funktion kann unerwartete Ergebnisse für Daten mit NaNs liefern. Um dies zu vermeiden, sollten NaNs entweder entfernt oder ersetzt werden.

Siehe auch

find_peaks_cwt

Peaks mithilfe der Wavelet-Transformation finden.

peak_prominences

Die Prominenz von Peaks direkt berechnen.

peak_widths

Die Breite von Peaks direkt berechnen.

Hinweise

Im Kontext dieser Funktion ist ein Peak oder lokales Maximum jeder Abtastwert, dessen zwei direkte Nachbarn eine kleinere Amplitude haben. Für flache Peaks (mehr als ein Abtastwert gleicher Amplitude breit) wird der Index des mittleren Abtastwerts zurückgegeben (abgerundet, falls die Anzahl der Abtastwerte gerade ist). Bei verrauschten Signalen können die Peakpositionen falsch sein, da das Rauschen die Position lokaler Maxima verändern kann. In solchen Fällen sollten Sie erwägen, das Signal vor der Peaksuche zu glätten oder andere Peakfindungs- und Fittingmethoden zu verwenden (wie find_peaks_cwt).

Einige zusätzliche Kommentare zur Angabe von Bedingungen

  • Fast alle Bedingungen (außer distance) können als halb-offene oder geschlossene Intervalle angegeben werden, z. B. 1 oder (1, None) definiert das halb-offene Intervall \([1, \infty]\), während (None, 1) das Intervall \([-\infty, 1]\) definiert. Das offene Intervall (None, None) kann ebenfalls angegeben werden, was die passenden Eigenschaften ohne Ausschluss von Peaks zurückgibt.

  • Die Grenze ist immer im Intervall enthalten, das zur Auswahl gültiger Peaks verwendet wird.

  • Für mehrere Bedingungen können die Intervallgrenzen mit Arrays angegeben werden, die mit x in der Form übereinstimmen, was dynamische Einschränkungen basierend auf der Abtastposition ermöglicht.

  • Die Bedingungen werden in folgender Reihenfolge ausgewertet: plateau_size, height, threshold, distance, prominence, width. In den meisten Fällen ist diese Reihenfolge die schnellste, da schnellere Operationen zuerst angewendet werden, um die Anzahl der Peaks zu reduzieren, die später ausgewertet werden müssen.

  • Während Indizes in peaks garantiert mindestens distance Abtastwerte voneinander entfernt sind, können die Kanten von flachen Peaks näher als der erlaubte distance liegen.

  • Verwenden Sie wlen, um die Zeit für die Auswertung der Bedingungen für prominence oder width zu reduzieren, wenn x groß ist oder viele lokale Maxima hat (siehe peak_prominences).

Hinzugefügt in Version 1.1.0.

Beispiele

Um die Verwendung dieser Funktion zu demonstrieren, verwenden wir ein Signal x, das mit SciPy geliefert wird (siehe scipy.datasets.electrocardiogram). Lassen Sie uns alle Peaks (lokale Maxima) in x finden, deren Amplitude über 0 liegt.

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

Wir können Peaks unter 0 mit height=(None, 0) auswählen oder Arrays verwenden, die mit x in der Größe übereinstimmen, um eine sich ändernde Bedingung für verschiedene Teile des Signals widerzuspiegeln.

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

Eine weitere nützliche Bedingung für periodische Signale kann mit dem Argument distance angegeben werden. In diesem Fall können wir die Positionen von QRS-Komplexen im Elektrokardiogramm (EKG) leicht auswählen, indem wir einen Abstand von mindestens 150 Abtastwerten verlangen.

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

Insbesondere bei verrauschten Signalen können Peaks leicht nach ihrer Prominenz gruppiert werden (siehe peak_prominences). Wir können zum Beispiel alle Peaks außer den erwähnten QRS-Komplexen auswählen, indem wir die zulässige Prominenz auf 0,6 begrenzen.

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

Und schließlich untersuchen wir einen anderen Abschnitt des EKG, der Schlagformen unterschiedlicher Gestalt enthält. Um nur die atypischen Herzschläge auszuwählen, kombinieren wir zwei Bedingungen: eine minimale Prominenz von 1 und eine Breite von mindestens 20 Abtastwerten.

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