Seite 1 von 1

Mittelung über ASCII Dateien

Verfasst: Donnerstag 2. April 2009, 07:28
von fk08
Hallo,

ich möchte über einen Datensatz mitteln. Der Datensatz besteht aus 3000 dat. Dateien, die jeweils nur eine Spalte enthalten.
Mein code soll folgendes machen: Eine vorgegebene Anzahl von Dateien einlesen und in eine Matrix speichern. d.h. jede Spalte entspricht dann einer Datei. Hierbei komme ich allerdings nicht weiter:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
from pylab import load,plot,figure,show,savefig,size,shape

spec = []

for i in range(4,7):
  fname = "/home//Documents/data//090331/42eV_35T_BS2D_10000%03d_ch_0.dat"%i
  in_file = open(fname)
  data = in_file.readlines()  #data ist ein string
  for i in range(0,len(data)): #jede zeile wird von string nach float umgewandelt und in spec gespeichert
    a = map(float, data[i].split())
    spec += [a]
   total +=[ spec]#spec ist die einzelne datei. vermutlich liegt hier am operator += der fehler?

print shape(total) liefert aber (3, 3000, 1). ich möchte allerdings (3,1000) haben.
wo liegt der hund begraben?
danke :D

Verfasst: Donnerstag 2. April 2009, 08:19
von Darii
Wie sehen denn die Dateien aus? Laut deiner Beschreibung so:

Code: Alles auswählen

1.2
1.3
5.6
...
laut deinem code:

Code: Alles auswählen

1.2 2.4 2.1 ...
2.4 5.4 3.2 ...
...
Wenn die Dateien deiner Beschreibung entsprechen müsstest du die innere for-Schleibe durch

Code: Alles auswählen

spec = map(float, data)
ersetzen. Auch verstehe ich nicht wie du bei 3000 Dateien auf (3,1000) kommen möchtest...
Außerdem sehe ich da ein Einrückungsproblem bei total...

Verfasst: Donnerstag 2. April 2009, 09:02
von CM
Hoi,

was Du suchst, bietet womöglich numpy.loadtxt(). Wenn numpy Dein matplotlib numerix Backend ist, ist loadtxt auch Teil des pylab namespace, d. h. Du kannst

Code: Alles auswählen

from pylab import loadtxt
dataarray = loadtxt('test.dat')
machen.

Allerdings verstehe ich auch Dein Datenformat nicht ganz, aber die Dimensionalität des arrays verändern ginge dann mit

Code: Alles auswählen

dataarray.reshape(shapetuple)
falls Du das überhaupt brauchst.

HTH
Christian

Verfasst: Donnerstag 2. April 2009, 10:39
von b.esser-wisser
Ich rate einfach mal, dass deine Dateien so aussehen:
42eV_35T_BS2D_10000004d_ch_0.dat hat geschrieben:10.1
123.
1.298371472865e-4
Eine Spalte, wie du gesagt hast. Dann lässt sich das, was du gesagt hast, am einfachsten so machen:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import pylab

FILEPATH="/home//Documents/data//090331"
FILENAME="42eV_35T_BS2D_10000%03d_ch_0.dat"
raw_data = []
for i in xrange(4,7):
  raw_data.append(pylab.loadtext( os.path.join(FILEPATH, FILENAME % i)))
#pylab.shape(raw_data) sollte hier (3,10) liefern

# suchst du den Mittelwert der drei Werte aus den Dateien?
total = pylab.average(raw_data, 0)
hth, Jörg
ps.: Ich habe so oft "wie du gesagt hast" geschrieben, weil dein Programm was anders macht... ;)