Zeile einer Tabelle als array Namen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
sanjo386
User
Beiträge: 7
Registriert: Samstag 4. März 2017, 11:47

Hallo zusammen,

ich möchte gerne eine txt-Datei bestehend aus einer irrelevanten Zeile am Anfang, einer zweiten Zeile mit Namen und darunter liegenden Messwerte mit variabler spaltenanzahl einlesen. Die zweite Zeile soll als array Namen für die jeweilig darunter liegenden Werte dienen, die spalten sind tab-getrennt. Was ich im Moment mangels Alternative mache, ich lese die Daten ein und mache die Zuordnung der spalten manuell. Das funktioniert, aber ist nun mal alles andere als schön und der Mehraufwand beim anpassen des Codes auf Dateien mit unterschiedlicher spaltenanzahl ist auch nicht schön. Gibt es evtl einen eleganteren Weg hierfür? Bin für Anregungen wirklich sehr dankbar.


Gruß
Sanjo[*]
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was meinst du mit array? Einen Array im Sinne des ´array` Moduls von Python oder einen Numpy-Array? Letzters liest OOTB alle Spalten ein, egal, wie viele es sind.

Allerdings kennen weder Arrays noch Numpy-Arrays Spaltenüberschriften...

Zeig' doch bitte mal einen Code.

Gruß, noisefloor
BlackJack

@sanjo386: Kennst Du das Pandas-Modul?
sanjo386
User
Beiträge: 7
Registriert: Samstag 4. März 2017, 11:47

noisefloor hat geschrieben:Hallo,

was meinst du mit array? Einen Array im Sinne des ´array` Moduls von Python oder einen Numpy-Array? Letzters liest OOTB alle Spalten ein, egal, wie viele es sind.

Allerdings kennen weder Arrays noch Numpy-Arrays Spaltenüberschriften...

Zeig' doch bitte mal einen Code.

Gruß, noisefloor
Hallo Noisefloor,

vielen Dank für die Rückmeldung. Array im Sinne eines Numpy-Arrays. Anbei der entsprechende Ausschnitt aus dem Code:

Code: Alles auswählen

x1, x2, x3, x4, x5, x6 = np.loadtxt(PATH, unpack = True)
Die Daten sehen folgendermaßen aus (bitte entschuldigt die Darstellung, ich habe es leider nicht anders hinbekommen, diese hochzuladen):

Unnötige Info in erster Zeile
Absatz
x1 x2 x3 x4 x5 x6
Absatz
0 0 0 0 0 0
1 10 100 1000 10000 100000
2 20 200 2000 20000 200000
3 30 300 3000 30000 300000
4 40 400 4000 40000 400000
5 50 500 5000 50000 500000
6 60 600 6000 60000 600000
7 70 700 7000 70000 700000
8 80 800 8000 80000 800000
9 90 900 9000 90000 900000

Ich lösche derzeit quasi die gesamte Kopfzeile bis zu den Daten und weise den Werten manuell x1 - x6 zu. Schön wäre es, dass ohne die Bearbeitung der Daten die Spaltennamen als Arraynamen verwendet werden und das am besten mit variabler Spaltenanzahl.
@sanjo386: Kennst Du das Pandas-Modul?
Nein, leider noch nicht.
BlackJack

@sanjo386: Und wie willst Du dann auf die dynamisch generierten Namen zugreifen? Du musst doch im weiteren Verlauf des Programms wissen wie viele Spalten die Datei hat und wie die Namen in der Kopfzeile lauten um damit weiterarbeiten zu können. Und was ist wenn eine Spalte in der Datei zufällig den Namen einer anderen Variable aus Deinem Programm hat, oder den Namen einer eingebauten Funktion oder eines Typs?

Auf jeden Fall ist das generieren von Variablennamen eine Sackgasse. Wenn überhaupt willst Du das über ein Wörterbuch regeln das die Spaltennamen auf die Daten der Spalte abbildet.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@sanjo386: Du mußt nur den Header einlesen und in eine passenden Recordtyp umwandeln:

Code: Alles auswählen

with open('datei') as data:
    _ = next(data) # unnötig
    header = next(data).split()
    data = np.loadtxt(data, dtype=[(c, float) for c in header])
Record-Daten haben den Vorteil, dass man sowohl Spalten als auch Zeilenweise zugreifen kann.
Antworten