Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
ich muss im Rahmen meiner Masterarbeit (Fach Physik) in Python Programmieren und habe seit Tagen ein Problem wo ich überhaupt nicht weiterkomme, ich muss aus einem Histogramm die Peaks "rausfischen"!
import matplotlib.pyplot as plt
y= numpy.array(...) # <- Array mit 128 Einträgen (alle positiv)
x = numpy.array(range(len(y)))
fig=plt.figure(1)
plt.xlabel('time [ns]')
plt.ylabel('Intensitaet')
plt.plot(x,y)
plt.show()
Ich erhalte auch wie erwartet eine "gezackte Kurve" und muss jetzt die Peaks rausfischen, d.h. alle lokalen Maximalstellen! Ich brauche den genauen Ort (also x und y Wert) sowie die Anzahl lokaler Maximalstellen. Hab rumgefragt und mich schon halb tot gegoogelt...
Ich wäre für jede Hilfe dankbar, bin am verzweifeln!! LG Travis
Zuletzt geändert von Anonymous am Mittwoch 5. März 2014, 20:36, insgesamt 1-mal geändert.
Grund:Quelltext in Python-Code-Tags gesetzt.
wenn man das Plottet,d.h.
plt.plot(x,y) # matplotlib.pyplot as plt
kommt eine gezackte Kurve raus, wo ich die Maxima ermitteln möchte, ich hab aber keine Ahnung wie :K gibt es vielleicht für dieses Problem ein fertiges Modul in scipy,numpy etc... oder kann man das nur per Hand ermitteln???
Was definiert den für dich ein Maximum? Sirius hat dir zwr die mathematische Funktion gegeben aber das wird die vermutlich nicht viel helfen da du ja nicht jedes mathematisches Maximum haben willst sondern die, die für dich physikalisch Sinn machen.
Nehmen wir z.B. mal das hier:
x:0,1,2,3,4,5,6,7,8,9,0
y:0,0,1,0,0,1,2,6,8,9,1
mathematisch hättest du z.B. an stelle 2 und 9 je ein lokales Maximum. Physikalisch ist hier aber nur der Eigentliche peak und nicht das Rauschen bei 2 interessant.
Du solltest dir also erst mal Gedanken machen was für dich Physikalisch ein Peak ist, welche Form du hast etc. Dann würde ich vermutlich eine Mathematische Funktion, die solche peaks beschreibt gegen meine Daten fitten und dann davon die maximale Höhe nehmen.
Die Frage des TE ist ungelöst und ich würde gerne von einer angemessenen Lösung lernen.
M.E. sollte man folgende Schritte umsetzen:
- Setzen eines Schwellwerts
- Ermittlung aller Maxima über dem Schwellwert (yk-1 < yk > yk+1 sowie y > Schwellwert)
- Sortieren der Maxima nach Größe
- Ausgabe als Wertepaare
In der Schulmathematik werden die lokalen Maxima durch Differenzieren berechnet. Gemessene Daten lassen sich jedoch in der Regel nur schlecht und nur mit einigem Aufwand differenzieren. Die Funktion Numpy.diff differenziert nämlich nicht!
Wenn man sich den Plot anschaut, dann sieht man die 4 Maxima sofort. Wodurch sind diese 4 Maxima nun gekennzeichnet? Der Wert y eines Maximums ist größer als der Schwellwert des Rauschens, bei diesen Daten ca. 0.01
y > 0.01
und das Maximum ist größer als sein linker und rechter Nachbar:
y > y[i-1] and y > y[i+1]
Nun hat aber nicht jeder Wert einen linken und einen rechten Nachbar, der 1. und der letzte Wert haben nur einen Nachbar, deshalb werden diese Werte bei der Suche weggelassen.
Vielen Dank für die Umsetzung!
(Ich war mittlerweile theoretisch auf dem richtigen Weg, hätte es aber noch nicht umsetzen können.)
Wie könnte man jetzt die Maxima als Wertepaare ausdrucken? Müsste man dazu erst ein zweidimensionales Array definieren, in das die Daten eingelesen werden?
Die Geschichten mit dem Doppelpunkt verstehe ich noch nicht ganz. y2 = y[1:-1] verschiebt offenbar die Werte um eine Einheit. Wo werden diese Dinge gut erklärt?
@pypet: Grundlegend wird die Slice-Syntax (sequence[i:j:k]) im Python-Tutorial in der Python-Dokumentation erklärt und natürlich dort auch noch mal in der Sprach-Referenz beschrieben. Für die leicht abweichende Semantik bei Numpy-Arrays (oft ”views” statt (flache) Kopien) wäre es vielleicht gut das Numpy-Tutorial mal durchzuarbeiten. Dort lernt man auch was für Objekte/Werte man als Index in Numpy-Arrays verwenden kann und wie das jeweilige Ergebnis aussieht. Schau Dir zum Beispiel mal an was `maxima` für einen Typ und Wert hat und wie das benutzt wird um auf die beiden Wertearrays zuzugreifen. Was dann Deine Wertepaare-Frage lösen sollte.
Gut, die Slice-Geschichten mit dem Doppelpunkt sind mir jetzt klar. y2 = y[1:-1] entfernt sozusagen das erste und das letzte Element der Arrays. y[:-2] entfernt die beiden letzten und y[2:] die beiden ersten Elemente.
"maxima" hat die Boolschen Werte "True" und "False".
Um die Wertepaare auszudrucken habe ich u.a. folgendes probiert, was aber nicht funktioniert:
i=0
for maxima[i]: # ("invalid syntax" am Doppelpunkt)
print x[i], y[i]
i += 1
Die Wahrheitsbedingung direkt abfragen geht ja offenbar auch nicht (z.B. "for maxima = True" o.ä.) und ist wohl auch nicht nötig.
Wäre nett, wenn mit jemand ein richtige Lösung mitteilen könnte. Für Erklärungen wäre ich ebenfalls sehr dankbar. Bin leider trotz umfangreicher Lektüre noch nicht auf die richtige Lösung gestoßen
@pypet: Slices entfernen nichts, sondern bieten nur eine andere Ansicht an. Für Deine weiteren Fragen solltest Du nochmal nachlesen, wie for-Schleifen funktionieren.
Danke MagBen für diese ausgezeichnete Lösung mit einer passenden Funktion, die für mich neu war!
(Hier wird sie behandelt und auf einen weiteren Link hingewiesen: http://www.saltycrane.com/blog/2008/04/ ... nd-zip-to/)
Da hätte ich noch lange for-Schleifen studieren oder mir Gedanken darüber machen können, ob jetzt Slices etwas aus dem Blick "entfernen", "sozusagen". :K
Danke für das lehrreiche Beispiel mit zip, was ich sicher noch oft gebrauchen werde.