Durchschnitt von Daten

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.
Antworten
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo zusammen.
Sagen wir, ich hab eine numpy.array mit Rohdaten:

Code: Alles auswählen

[ 4.54187404  5.44150706  1.79067179 ...,  5.47850569  5.30213909
  5.8472153 ]
, deren Länge 10000 beträgt. Es ist wenig hilfreich, diese Daten direkt zu plotten, hingegen ist es sinnvoller, einen Durchschnitt über Abschnitte auf den Daten zu plotten. Also aus den ersten 100 Punkten (= das erste Segment) wird der Durchschnitt berechnet, dann aus den nächsten 100 und so weiter. So kommt man auf 100 Punkte. Wie kann ich jetzt die Durchschnitte mit den Rohdaten "überlagert" plotten? Die Liste aus Durchschnitten ist ja jetzt 100 mal kürzer, plottet man jetzt einfach 100 mal den gleichen Wert für jedes Segment?
Mein Code für die Berechnung des Durchschnittes:

Code: Alles auswählen

Eav = array( [reduce(lambda x,y: x+y, i)/len(i) for i in [E[i:i+segm] for i in range(0, len(Eraw), segm)] ] )
Sieht scheisse aus, geht aber irgendwie.
Ein Bild davon kann man hier sehen.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@mzh: Wie wäre es mit einem laufenden Mittel:

Code: Alles auswählen

values = numpy.random.rand(10000)
means = numpy.convolve(values, numpy.ones(100)/100.0, 'same')
Mit Hilfe von Slicing kann man natürlich auch nur jeden 100ten Wert nehmen. Wie man das plotten soll hängt davon ab, was du als nicht so schlimm ansiehst.
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

[quote="mzh"]Hallo zusammen.
Sagen wir, ich hab eine numpy.array mit Rohdaten:

Code: Alles auswählen

 Wie kann ich jetzt die Durchschnitte mit den Rohdaten "überlagert" plotten? Die Liste aus Durchschnitten ist ja jetzt 100 mal kürzer, plottet man jetzt einfach 100 mal den gleichen Wert für jedes Segment?[/quote]
Ich wuerde den Durschnitt laufend berechnen, das heisst jeweils die 50 Werte davor und dahinter mitteln. 
Das ist aber natuerlich mit mehr Rechenaufwand verbunden.

EDIT: Da war ich wohl zu langsam :-)
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Ach..., numpy ist an der Stelle recht flott :wink: :

Code: Alles auswählen

import numpy
from time import clock
values = numpy.random.rand(10000)
t = clock()
means = numpy.convolve(values, numpy.ones(100)/100.0, 'same')
print clock() - t

Code: Alles auswählen

0.00547304196483
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Danke Leute für den Hinweis auf convolve.
Ich habs ausprobiert, was mich allerdings wundert ist, weshalb der Durchschnitt am Ende so stark fällt (besonders bei der roten Kurve sichtbar).
Hier nochmals der Link auf die jüngste Figur.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@mzh: Randbedingungen.
Antworten