2016-11-19 2 views
2

Ich bin in diesem kleinen Problem nach einer Stunde der Suche vorherige Antwort stecken. Ich möchte Matrizen von meinem Code speichern in .yaml DateiErgebnisse in YAML-Datei mit Python speichern

Was ich von meinem Code erhalten

Matrix 
[[ 1.00665266e+03 0.00000000e+00 5.08285432e+02] 
[ 0.00000000e+00 1.01086937e+03 3.45995536e+02] 
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]] 

Wie ich versucht, diese Matrix zu speichern (mtx ist der kürzere Name in meinem Code)

fname = "calibrationC300.yaml" 

data = dict(
    Matrix = mtx, 
) 

with open(fname, "w") as f: 
    yaml.dump(data, f, default_flow_style=False) 

Aber was ich in meiner YAML-Datei lesen ist völlig falsch (nur nur schlecht Umwandlung?)

Matrix: !!python/object/apply:numpy.core.multiarray._reconstruct 
    args: 
    - &id001 !!python/name:numpy.ndarray '' 
    - !!python/tuple [0] 
    - b 
    state: !!python/tuple 
    - 1 
    - !!python/tuple [3, 3] 
    - !!python/object/apply:numpy.dtype 
    args: [f8, 0, 1] 
    state: !!python/tuple [3, <, null, null, null, -1, -1, 0] 
    - false 
    - !!binary | 
    cWM87e1YkEAAAAAAAAAAAIUEEyb5SH1AAAAAAAAAAACp/Z3yc2qQQFv0vPqb5nZAAAAAAAAAAAAA 
    AAAAAAAAAAAAAAAAAPA/ 

Es ist das erste Mal, dass ich Yaml-Dateien verwende, was mache ich falsch? Gibt es eine Methode, um die Matrix in der einfachen Form (wie ich es aus dem Code erhalte) in der Yaml-Datei zu erhalten? Vielen Dank im Voraus

+0

Was ist Ihr Ziel - etwas zu bekommen, das für die Eingabe in ein numpliges Skript geeignet ist, etwas Portables, das für die Eingabe in ein anderes Werkzeug oder etwas für Menschen lesbar ist? –

+0

@JohnCarter bevorzugen alle diese drei Dinge. Für die Eingabe für mein numpy Skript habe ich gerade gelöst mit numpy.savez – marcoresk

Antwort

1

Ich bin kein Experte, aber das produzierte Yaml scheint richtig. Sie können sehen, dass die primitiven Typen standardmäßig gut dargestellt werden. Für die anderen müssen Sie möglicherweise etwas unternehmen. Lesen Sie hier in der documentation.

Viel Glück!

(ich habe nicht genug rep haben. Kommentar, sonst hätte ich diesen Beitrag als Kommentar hinterlassen.)

+0

@Ich werde versuchen, Ihren Link zu sehen, danke.Weißt du, ob es eine Methode gibt, um meine Matrix in der gleichen Form zu speichern, wie ich sie in meinem Code erhalte? (Ich habe Ihre Antwort aktualisiert, so dass Sie nun genügend Reputation haben, um einen Kommentar abzugeben!) – marcoresk

+0

Aus der Dokumentation scheint es, dass Sie Ihre eigene Unterklasse des yaml.YAMLObject erstellen müssen, und geben Sie __repr__, __init__ und yaml_tag an. Ich würde denken, dass es irgendwo verfügbar ist ... aber ich kann es nicht finden. Wenn Sie nur serialisieren möchten, könnten Sie die Matrix in eine verschachtelte Liste konvertieren? –

+0

Ich kann auch kein Beispiel finden. Ich möchte meine Matrix als Matrix speichern, um sie in ein anderes Skript zu laden. Ich beginne mich zu fragen, ob YAML nicht die richtige Wahl ist ... – marcoresk

3

Das einzige, was hier falsch scheint Ihre Erwartung zu sein, wie numpy Einbauten können und sollten entsorgt werden zu YAML.

Eine einfache Überprüfung, dass das, was Sie bekommen haben, wie YAML richtig ist, zu load ist, was Sie dump -ed:

import ruamel.yaml 
import numpy 
import pprint 

mtx = numpy.multiarray = [[1.00665266e+03, 0.00000000e+00, 5.08285432e+02], 
          [0.00000000e+00, 1.01086937e+03, 3.45995536e+02], 
          [0.00000000e+00, 0.00000000e+00, 1.00000000e+00],] 

data = dict(Matrix=mtx) 

yaml_str = ruamel.yaml.dump(data, default_flow_style=False) 
data = ruamel.yaml.load(yaml_str) 
print(data) 

die gibt:

{'Matrix': [[1006.65266, 0.0, 508.285432], [0.0, 1010.86937, 345.995536], [0.0, 0.0, 1.0]]} 

Die speziellen Typen, die numpy verwendet werden nicht als einfache (und lesbare) YAML ausgegeben, gibt es keine Garantie, dass das neu geladen werden könnte. Es könnte für einige Konstrukte möglich sein, obwohl es leicht zu Mehrdeutigkeiten führt, und eine AFAIK-Vereinfachung wird für keinen der numpy Typen durchgeführt.

Natürlich können Sie das YAML-Dump kann, ohne dass Informationen seine numpy Versorgung wieder herstellen, indem Sie:

ruamel.yaml.round_trip_dump(data, sys.stdout) 

die gibt:

Matrix: 
- - 1006.65266 
    - 0.0 
    - 508.285432 
- - 0.0 
    - 1010.86937 
    - 345.995536 
- - 0.0 
    - 0.0 
    - 1.0 

viel besser lesbar, aber nicht etwas, das jemals sein wird ein numpy.multiarray automatisch wenn Sie load() es wieder von seiner YAML-Darstellung.

Verwandte Themen