Seite 1 von 1

Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Sonntag 15. November 2015, 21:25
von tine_beginner
Hallo zusammen,

ich bin noch neu in der Welt der Programmierung unterwegs. Ich habe folgendes Anliegen:
ich habe angenommen knapp 100 csv-Dateien mit Semikolon-getrennten Werten. Diese sind Thermografie-Bilder (eine Datei = ein Messzeitpunkt), jedes Pixel ist also ein Temperaturwert in °C. Eine Datei ist sagen wir mal 100x100 Pixel groß, sieht also beispielhaft so aus:

Code: Alles auswählen

4.56;3.23;6.75;6.60;4.32;3.43
3.54;2.31;2.56;2.34;1.23;7.65
5.43;6.54;8.43;2.45;6.43;2.21
8.56;4.34;6.56;3.34;6.54;4.53
Ich muss nun von den ersten 50 Dateien und von den letzten 50 Dateien jeweils den Mittelwert jedes Pixels ausrechnen (also den Mittelwert von den 50 [0,0], von den 50 [0,1], usw.). Dabei erhalte ich dann ja nach der Berechnung theoretisch zwei Dateien mit der gleichen Dimension wie die Thermografie-Bilder, an Stelle [0,0] der Mittelwert der 50 [0,0] usw.
Dann muss ich im letzten Schritt nur noch das eine entstandene array von dem anderen abziehen. Wenn meine zwei "Mittelwert-arrays" etwa so aussehen (einfach so tun als wären ganz unterschiedliche Zahlen in den arrays):

Code: Alles auswählen

4.56;3.23;6.75
3.54;2.31;2.40
6.53;6.54;8.43
8.56;4.34;6.56

und

3.56;2.23;6.75
3.54;2.31;2.56
5.43;3.54;5.43
4.56;4.34;6.56
dann muss ich noch das zweite array vom ersten subrahieren, brauche also am Ende den Output mit dem Subtraktionsergebnis von [0,0] des ersten und zweiten arrays, das [0,1] des ersten und zweiten arrays, usw:

Code: Alles auswählen

1;1;0
0;0;-2.856
1.1;3;3
4;0;0
Ich weiß leider nicht so recht, wie ich überhaupt ansetzen muss, damit alle Dateien (es sind so 5000 Stück) verarbeitet werden. Theoretisch klingt das für mich recht gut und schnell lösbar, leider fehlen mir dafür aber die Kenntnisse. Ich habe hier im Forum auch bereits nach einer Antwort gesucht, aber leider nichts passendes gefunden. Vielen dank schon einmal!

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Sonntag 15. November 2015, 21:34
von Sirius3
@tine_beginner: wie man Dateien mit numpy einliest, weißt Du ja schon. Wie man mit Arrays rechnet, steht in der Dokumentation. Also: Dateien nacheinander einlesen, Summe bilden, durch Anzahl teilen.

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Sonntag 15. November 2015, 22:05
von tine_beginner
@Sirius3 Ist meine frage zu trivial? Welche Dokumentation meinst du? Wenn ich so fit in dem ganzen wäre, hätte ich bestimmt schon etwas gefunden :oops:

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Sonntag 15. November 2015, 22:59
von Sirius3
@tine_beginner: das Zauberwort heißt "Eigeninitiative". Wie gesagt, Einlesen der Dateien dürfte kein Problem sein, for-Schleifen solltest Du auch schon kennen und wie man Mittelwerte ausrechnet, sollte Dir in der Theorie bekannt sein. In der numpy-Dokumentation steht, dass bei zwei Arrays A und B A+B jeweils die einzelnen Elemente addiert. Damit hast Du alles zusammen, was Du brauchst. Solltest Du irgendwo konkret noch Probleme haben, kannst Du ja Code posten.

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Sonntag 15. November 2015, 23:26
von BlackJack
@tine_beginner: Das übliche Vorgehen ist Probleme in kleinere Teilprobleme zu zerlegen, und dann wenn es ein muss die Teilprobleme wieder in weitere Teilprobleme, solange bis die einzelnen Teilprobleme so klein sind, dass man sie jeweils mit einer Funktion mit wenigen Zeilen Code lösen kann. Das macht man dann, und testet ob die Teillösung so funktioniert wie sie soll, und erst wenn sie das tut geht man zum nächsten Teilproblem über. Wenn man mehrere Teilprobleme gelöst hat die man zu einer grösseren Teillösung zusammensetzen kann, dann tut man das und testet diese Lösung wieder. Das macht man so lange bis man eine Gesamtlösung hat. So verlieren auch anfangs scheinbar unüberwindbare Probleme durch kleine Schritte ihren Schrecken. :-)

Beim identifizieren des ersten zu lösenden Teilproblems habe ich allerdings dann schon ein Problem: „ich habe angenommen knapp 100 csv-Dateien“ und „damit alle Dateien (es sind so 5000 Stück) verarbeitet werden“ verwirrt mich ein wenig.

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 00:15
von tine_beginner
@Sirius3 @BlackJack: danke euch. Ja da habe ich quatsch geschrieben, ich wollte beispielhaft nur 100 Dateien nennen und habe zum Schluss doch die tatsächliche Anzahl genannt. Ich werde mir die Doku zu numpy durchlesen und hoffe, dann weiter zu kommen.

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 06:55
von MagBen
tine_beginner hat geschrieben:Ich werde mir die Doku zu numpy durchlesen und hoffe, dann weiter zu kommen.
Die Doku auf der Numpy-Seite ist eher eine API-Doku und kein Anfänger-Tutorial. Anfänger-Tutorials zu Numpy findest Du z.B. hier:
http://cs231n.github.io/python-numpy-tutorial/
http://www.labri.fr/perso/nrougier/teac ... numpy.html

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 09:20
von kodela
MagBen hat geschrieben:... Anfänger-Tutorials zu Numpy findest Du z.B. hier:
Da möchte ich noch eine deutschsprachige Quelle erwähnen:

http://www.python-kurs.eu/numpy.php

MfG, kodela

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 09:39
von Sirius3
@kodela: die Tutorials auf der von Dir verlinkten Seite sind meist von sehr minderer Qualität. Solche Aussagen, dass Python (Ende 1980er) modernen als Matlab (Anfang 1980er) ist, sind doch sehr tendentiös, da sich beide noch weiterentwickeln.
Gutes Python sieht auch anders aus, z.B.:

Code: Alles auswählen

Z = [x+y for x,y in zip(X,Y)]

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 10:34
von kodela
Hallo @Sirius3:

Ich sehe hier in diesem ausgezeichneten Forum ein Problem. Es ist die relativ große Anzahl an wirklichen Fachleuten zum Thema "Python", die in einer Weise, wie ich es eigentlich noch in keinem anderen Forum gefunden habe, bemüht ist, zu helfen. Da ist natürlich noch nicht das Problem, ganz im Gegenteil. Das Problem liegt allerdings darin, dass es Fachleuten meistens schwer fällt, sich in die Sichtweise von Nicht-Fachleuten hinein zu denken.

tine_beginner hat doch geschrieben:
... ich bin noch neu in der Welt der Programmierung unterwegs. ...
Und er hat sich, was auch nicht übersehen werden sollte, an das deutschsprachige Python-Forum gewandt. Man darf daraus wohl schließen, dass er/sie Deutsch besser beherrscht, als Englisch, um nicht zu sagen, er/sie hätte ein Problem mit Englisch. Wenn ich zum Beispiel die englische Sprache so verstünde, wie meine eigene, würde ich mich für Problemlösungen jeglicher Art wohl in erster Linie an ein englischsprachiges Forum wenden.

Daraus sollte man folgern, Hilfesuchende nicht ausschließlich an (die besseren) englischsprachige Quellen zu verweisen und auch nicht abwertend zu reagieren, wenn dies ein anderer macht. Ich habe mir die beiden von Dir verlinkten Quellen angesehen. Sie sind wirklich ausgezeichnet. Trotzdem war mir auch die von mir verlinkte Quelle zum Verständnis eine Hilfe.

Ich darf einmal zitieren, was Du hier geschrieben hast:
... wie man Dateien mit numpy einliest, weißt Du ja schon. Wie man mit Arrays rechnet, steht in der Dokumentation. ...
Und die Antwort:
... Ist meine frage zu trivial? Welche Dokumentation meinst du? Wenn ich so fit in dem ganzen wäre, hätte ich bestimmt schon etwas gefunden ...
Das sagt doch alles und es wäre super, wenn man bei den Hilfestellungen ganz allgemein berücksichtigen würde, dass der Hilfesuchende ja meistens kein Spezilist in Sache Python ist.

MfG, kodela

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 10:49
von Sirius3
@kodela: tine_beginner ist ja kein unbeschriebenes Blatt. Sie hat schon eine ganz ähnliche Frage gestellt, und ich gehe davon aus, dass sie sich daran erinnert und notfalls nachschlägt. Wenn man immer wieder das selbe vorkaut, ist niemandem geholfen. Also: Hilfe zur Selbsthilfe.

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 11:28
von kodela
Hallo @Sirius3:

Du hast Recht. Das wusste ich ja nicht. Entschuldige also bitte meine Einmischung.

Was ich jedoch so "ganz allgemein" zum Ausdruck brachte, das scheint mir aber doch wichtig zu sein.

MfG, kodela

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 12:16
von tine_beginner
vielen Dank für die zahlreichen Tutorial-Tipps!

Ich habe nun mal folgendes probiert:

Code: Alles auswählen

import numpy
import glob

all_files = glob.glob('.csv')

for one_file in all_files:
  try: # some files have 9, others 17 rows of header
      with open(one_file) as data:
         ir_picture = numpy.genfromtxt(((line.replace(',','.') for line in data),
                                         skip_header=9,delimiter=";")
  except ValueError:
         ir_picture = numpy.genfromtxt((line.replace(',','.') for line in data),
                                        skip_header=17,delimiter=";")
damit hätte ich ja erstmal alle csv-Dateien aus dem Ordner angesprochen. Nun müsste ich ja die einzelnen Dateien addieren und davon dann die Anzahl abziehen um den Mittelwert zu erhalten. Also irgendwie so:

Code: Alles auswählen

first_file = np.fromfile('1.csv', dtype=np.int)   
second_file = np.fromfile('2.csv', dtype=np.int)   
third_file = np.fromfile('3.csv', dtype=np.int)   

mean_all_files = (first_file + second_file + third_file) / 3.0

mean_all_files.tofile('mean.csv')
Aber wie stelle ich diese Berechnung für alle Dateien an? Habe schon sowas versucht wie

Code: Alles auswählen

mean_before = np.nansum(ir_picture)
das bezieht sich dann jedoch nur auf eine einzige Datei.

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 12:19
von tine_beginner
@kodel: wow, ich bin begeistert von deinem Kommentar. Ich sehe eure Beiträge aber jetzt erst nachdem ich meinen weiteren Kommentar geschrieben habe, wollte ihn nun löschen, tu es aber doch nicht. Du sprichst mir aus der Seele ;) was nicht heißt, dass ich mir die Antworten der "Profis" hier nicht auch zu Herzen nehme und natürlich recherchiere so viel ich kann und mir mit Sicherheit nichts vorkauen lassen will. Das Gefühl, selbst eine Lösung zu finden ist sowieso das beste, aber mir fehlen einfach noch manchmal nötige Ansatzpunkte. Naja, vielleicht wird es ja bald besser.

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Montag 16. November 2015, 13:09
von Sirius3
@tine_beginner: statt first_file, second_file, usw. nimmt man eine Liste, Mittelwert ist dann sum(pictures) / len(pictures).

Re: Zeitreihe - für jedes Pixel Mittelwert berechnen

Verfasst: Mittwoch 25. November 2015, 19:23
von tine_beginner
Es hatte super funktioniert mit

Code: Alles auswählen

sum(pictures) / len(pictures)
Vielen Dank! Das hatte ich in meinem letzen Beitrag auch gemeint anstatt nur "mean_before = np.nansum(ir_picture)"