Argrelextrema und flache Extrema

Funktion argrelextrema von scipy.signal erkennt keine flachen extrema. Beispiel:

import numpy as np from scipy.signal import argrelextrema data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 1, 0 ]) argrelextrema(data, np.greater) (array([2]),) 

Die erste max (2) wird erkannt, die zweite max (3, 3) wird nicht erkannt.

  • Effizienteste / schnellste Weg, um Pixeldaten mit Python zu analysieren?
  • Skip pytest, wenn kein Parameter vorhanden ist
  • Python IRC bot wird nicht beitreten
  • Zeitdifferenz in Sekunden (als Gleitkomma)
  • Python: Berechnung der Kosinus Ähnlichkeit von zwei Dicts schneller
  • Mit st_mode zur Identifizierung von Datei oder Verzeichnis
  • Irgendein Workaround für dieses Verhalten? Vielen Dank.

  • Python "help" -Funktion: Druck docstrings
  • Python + Django Seite umleiten
  • Tensorflow mischt Bilder und Etiketten bei der Herstellung von Batch
  • Kein api-Proxy fand für den Dienst "app_identity_service" beim Ausführen von GAE-Skript
  • Roboter-Framework-Pass-Cookie, um Anfrage zu erhalten (RequestsLibrary) - TypeError
  • Holen Sie sich ausgehende Portnummer von urllib2
  • One Solution collect form web for “Argrelextrema und flache Extrema”

    Kurze Antwort: Wahrscheinlich ist argrelextrema nicht flexibel genug für deine Aufgabe. Betrachten Sie das Schreiben Ihrer eigenen Funktion, die Ihren Bedürfnissen entspricht.


    argrelextrema Antwort: Sind Sie verpflichtet, argrelextrema zu benutzen? Wenn ja, dann kannst du mit dem comparator und den order von argrelextrema (siehe Referenz ).

    Für dein einfaches Beispiel reicht es aus, np.greater_equal als comparator zu np.greater_equal .

     >>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 1, 0 ]) >>> print(argrelextrema(data, np.greater_equal,order=1)) (array([2, 6, 7]),) 

    Beachten Sie jedoch das auf diese Weise

     >>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 4, 1, 0 ]) >>> print(argrelextrema(data, np.greater_equal,order=1)) (array([2, 6, 8]),) 

    Verhält sich anders, was man wohl mag, die ersten 3 und die 4 als Maxima zu finden, da argrelextrema nun alles als ein Maximum sieht, das größer oder gleich seinen beiden nächsten Nachbarn ist. Sie können nun das order verwenden, order zu entscheiden, wie viele Nachbarn dieser Vergleich haben muss – die Wahl von order=2 würde mein oberes Beispiel ändern, um nur 4 als maximal zu finden.

     >>> print(argrelextrema(data, np.greater_equal,order=2)) (array([2, 8]),) 

    Dafür gibt es aber einen Nachteil – lassen Sie uns die Daten noch einmal ändern:

     >>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 4, 1, 5 ]) >>> print(argrelextrema(data, np.greater_equal,order=2)) (array([ 2, 10]),) 

    Das Hinzufügen eines anderen Gipfels als letzter Wert hält dich davon ab, deinen Peak bei 4 , da argrelextrema nun einen zweiten Nachbarn sieht, der größer als 4 (was für laute Daten nützlich sein kann, aber nicht unbedingt das Verhalten in allen Fällen erwartet).


    Mit argrelextrema werden Sie immer auf binäre Operationen zwischen einer festen Anzahl von Nachbarn beschränkt. Beachten Sie jedoch, dass alle argrelextrema in Ihrem Beispiel oben ist, um n , wenn data[n] > data[n-1] and data[n] > data[n+1] . Sie könnten das selbst leicht umsetzen und dann die Regeln verfeinern, zB indem man den zweiten Nachbarn überprüft, falls der erste Nachbar denselben Wert hat.


    Um der Vollständigkeit willen gibt es eine aufwändige Funktion in scipy.signal , find_peaks_cwt . Ich habe aber keine Erfahrung damit und kann dir deshalb nicht mehr dazu geben.

    Python ist die beste Programmiersprache der Welt.