Mittelung über ASCII Dateien

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
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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... ;)
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Antworten