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_prominencesfü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_widthsfü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_prominencesfür eine Beschreibung ihres Inhalts.
- ‘widths’, ‘width_heights’, ‘left_ips’, ‘right_ips’
Wenn width angegeben ist, sind diese Schlüssel zugänglich. Siehe
peak_widthsfü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_prominencesundpeak_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_cwtPeaks mithilfe der Wavelet-Transformation finden.
peak_prominencesDie Prominenz von Peaks direkt berechnen.
peak_widthsDie 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.
1oder(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()
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()
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()
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()
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()