liste von arrays in .txt Datei speichern

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
fkh
User
Beiträge: 6
Registriert: Sonntag 25. September 2011, 18:15

Hallo an alle,

Bei meinem Problem kann mir leider google und die python doku nicht weiterhelfen.
Ich möchte arrays, die ich aus einer Datei ausgelesen und in einer liste aneinandergehängt habe, als *.txt abspeichern. Das funktioniert auch wunderbar, aber wenn ich die erhaltene liste als *.txt abspeichern möchte, dann erscheinen Fehlermeldungen mit denen ich leider nichts anfangen kann..
Hier erstmal der Code

Code: Alles auswählen

filename = '/home/...llfiles.list'

data = np.loadtxt(filename, dtype ='S') # Hier sind einfach als Vektor alle Pfade zu den Datenmatrizen drin
print data
print len(data)

Nied = []
for n in range(len(data)):
    filename_ = data[n]   
    dat = np.loadtxt(filename_, skiprows=1) #einlesen der einzelnen Datenmatrizen aus den Pfaden
    nied = dat[:,6]
    Nied.append(nied) #alle Datenvektoren werden in einer Liste gesammelt
    print n
np.savetxt('Nied_basis.txt',Nied, delimiter=' ')
so das abspeichern funktioniert komischerweise für range(1000) aber nicht für range(2543=len(data)). Dann bekomme ich folgende Fehlermeldungen:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/iplex/01/sys/libraries//lib64/python2.6/site-packages/numpy/lib/npyio.py", line 979, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: float argument required, not numpy.ndarray
Wenn ich jetzt versuche die Nied[n] in floats umzuwandeln passiert folgendes:

Code: Alles auswählen

>>> type(Nied)
<type 'list'>
>>> type(Nied[0])
<type 'numpy.ndarray'>
>>> float(Nied[0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: only length-1 arrays can be converted to Python scalars
Wäre für jede Hilfe dankbar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

fkh hat geschrieben: Bei meinem Problem kann mir leider google und die python doku nicht weiterhelfen.
Ich möchte arrays, die ich aus einer Datei ausgelesen und in einer liste aneinandergehängt habe, als *.txt abspeichern. Das funktioniert auch wunderbar, aber wenn ich die erhaltene liste als *.txt abspeichern möchte, dann erscheinen Fehlermeldungen mit denen ich leider nichts anfangen kann..
Hu? Hier sehe ich einen Widerspruch! Du machst "a" und das klappt, wenn Du aber "a" machst, klappt es nicht? :K

Generell solltest Du erwähnen, dass Du `numpy` nutzt - das ist ja nun mal kein Modul aus der Standardlib. Zudem solltest Du mal ein minimales lauffähiges Beispiel posten. ggf. Damit könnten wir das lokal ausführen und versuchen den Fehler nachzuvollziehen.

Mir ist nach Studium Deines Codes immer noch nicht ganz klar, worin das eigentliche Problem besteht. Wenn ich das richtig verstehe liest Du aus einer Konfigurationsdatei eine Liste von Dateinamen ein, aus welchen Du dann in einer Schleife einzelne Datensätze ausliest. Diese vereinigst Du dann in einer Standard-Python-Liste. Diese willst Du dann wieder per `numpy` serialisieren. Ist das so weit richtig?

Wieso mischt Du Listen und `numpy`-Arrays? Könnte da der Fehler liegen?
Wieso müssen Dateinamen in eine `numpy`-Datenstruktur eingelesen werden? (Oder liefert `np.loadtxt` eine Standardliste? Ich hätte da ja irgend wie ein Standardformat wie JSON, INI oder gar ein Flatfile verwendet (Kompletter Pfad in einer Zeile).

Man kann über die Elemente einer Liste direkt iterieren. Konstrukte a la `for n in range(len(foo))` sind idR überflüssig:

Code: Alles auswählen

for item in liste:
    # item ist aktuelles Element der Liste
# oder mit Index:
for index, item in enumerate(liste):
    # item wie gehabt, index wird von 0 aufsteigend nummeriert.
Letzte Frage: Bist Du sicher, dass es an der Anzahl der Datensätze liegt? Kann es nicht sein, dass der 2543ste Datensatz Müll enthält?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
fkh
User
Beiträge: 6
Registriert: Sonntag 25. September 2011, 18:15

Hallo Hyperion,

danke erstmal für die schnelle Antwort.
Hu? Hier sehe ich einen Widerspruch! Du machst "a" und das klappt, wenn Du aber "a" machst, klappt es nicht?
da liegt eben auch mein problem. Ich verstehe die Fehlermeldung nicht, da es mit anderen Datenvektoren klappt.
Bist Du sicher, dass es an der Anzahl der Datensätze liegt? Kann es nicht sein, dass der 2543ste Datensatz Müll enthält?
Die Daten wurden vorher aufbereitet, falls das der Fall ist, hat mein Vorarbeiter Mist gebaut. Was meinst du genau mit Müll? Also zum beispiel ein 'nan' oder '-9999' statt einer Dezimalzahl, falls das der Grund für die Fehlermeldung ist, schicke ich den Datensatz zurück zum Absender und er muss nochmal überarbeitet werden.
Zudem solltest Du mal ein minimales lauffähiges Beispiel posten. ggf. Damit könnten wir das lokal ausführen und versuchen den Fehler nachzuvollziehen.

Meinst du damit mit den Datenvektoren hochladen? Die kann ich nicht hochladen, die sind viel zu groß.
Mir ist nach Studium Deines Codes immer noch nicht ganz klar, worin das eigentliche Problem besteht. Wenn ich das richtig verstehe liest Du aus einer Konfigurationsdatei eine Liste von Dateinamen ein, aus welchen Du dann in einer Schleife einzelne Datensätze ausliest. Diese vereinigst Du dann in einer Standard-Python-Liste. Diese willst Du dann wieder per `numpy` serialisieren. Ist das so weit richtig?
Ja soweit war das mein Gedanke. Die Arrays in der Liste wollte ich dann in eine Textdatei schreiben, damit sie transportiebar sind.
Wieso mischt Du Listen und `numpy`-Arrays? Könnte da der Fehler liegen?
Sollte eigentlich kein Problem sein. Werde das aber mal überprüfen
Wieso müssen Dateinamen in eine `numpy`-Datenstruktur eingelesen werden? (Oder liefert `np.loadtxt` eine Standardliste? Ich hätte da ja irgend wie ein Standardformat wie JSON, INI oder gar ein Flatfile verwendet (Kompletter Pfad in einer Zeile)
Müssen sie nicht. Allerdings komme ich von Matlab, deswegen arbeite ich gerne mit numpy, weil das sehr ähnlich funktioniert. Macht das einen großen Unterschied, mit was ich die Daten einlese? Für den Fall wird das natürlich abgeändert.
Danke für den Hinweis mit den Schleifen, aber das 'for n in range' ist einfach noch aus Matlab hängen geblieben ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mit "minimal lauffähigen" Beispiel meine ich genau das, was es bedeutet. Du postest hier Code, den ich exakt so auf meinem System ausführen kann. Dazu braucht es dann ggf. eben auch Daten.

Diese musst Du ja nicht posten, sondern kannst sie ja im Script generieren, oder Du postest dazu ein Script, welches die generiert.

Sollten dabei die Probleme nicht auftreten, so könnte man doch wieder zu dem Verdacht kommen, dass eben etwas an dem Datensatz kaputt ist, bei dem der Fehler auftritt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
fkh
User
Beiträge: 6
Registriert: Sonntag 25. September 2011, 18:15

Ich wüsste nicht, was das bringen sollte. Das Programm funktioniert bei einigen Datensätzen und bei anderen nicht mit eben dieser oben erwähnten Fehlermeldung.
Mein Problem ist jetzt einfach, dass ich die Fehlermeldung überhaupt nicht einordnen und deswegen auch keine Lösung für die Datensätze finden kann, bei denen das Abspeichern nicht funktioniert. Ich habe ja schon öfter numpy.arrays abgespeichert und es war überhaupt kein Problem...
Meine Frage war und ist einfach nur, ob jemand weiß, was Python mir mit dieser Fehlermeldung sagen möchte, damit ich ggf. den Datensatz so anpassen kann, dass der Fehler nicht mehr auftritt.
Aber vielen Dank für deine Bemühungen.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

TypeError: only length-1 arrays can be converted to Python scalars
Ist doch irgendwie klar?!? Du probierst ein Array in ein Scalar umzuwandeln, dass nicht Länge 1 hat. An deiner Stelle würde ich einfach mal den Debugger anschmeissen und gucken, um welche Daten es sich da handelt bzw. wie du zu genau dieses Daten kommst.

Grüße,
anogayales
BlackJack

@fkh: Die Fehlermeldung sagt, dass da an einer Stelle eine Gleitkommazahl erwartet wurde, aber ein Array stattdessen gefunden wurde. Wahrscheinlichste Fehlerquelle ist, dass du da etwas übergibst was nicht zweidimensional ist, sondern mehr Dimensionen hat.

Edit: Ganz konkret darf in Deinen Dateien maximal eine Zeile stehen, damit das eindimensional bleibt. Denn wenn Da mehr als eine Datenzeile steht, ist das Ergebnis von dem `loadtxt()` zweidimensional und Du steckst diese 2D-Daten in eine Liste → 3. Dimension.
Antworten