scipy.io.loadmat verschachtelte Strukturen (d. h. Wörterbücher)
Verwendung der angegebenen Routinen (wie load Matlab .mat-Dateien mit scipy), ich konnte nicht auf tiefer verschachtelte Strukturen zu erholen, Sie in Wörterbücher
Präsentieren das problem, das ich laufen in mehr detail, ich gebe das folgende Spielzeug-Beispiel:
load scipy.io as spio
a = {'b':{'c':{'d': 3}}}
# my dictionary: a['b']['c']['d'] = 3
spio.savemat('xy.mat',a)
Nun will ich Lesen Sie die mat-Datei wieder in python. Ich habe versucht, die folgenden:
vig=spio.loadmat('xy.mat',squeeze_me=True)
Wenn ich jetzt zugreifen will, die Felder die ich bekomme:
>> vig['b']
array(((array(3),),), dtype=[('c', '|O8')])
>> vig['b']['c']
array(array((3,), dtype=[('d', '|O8')]), dtype=object)
>> vig['b']['c']['d']
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/<ipython console> in <module>()
ValueError: field named d not found.
Jedoch mithilfe der option struct_as_record=False
Bereich zugegriffen werden konnte:
v=spio.loadmat('xy.mat',squeeze_me=True,struct_as_record=False)
Nun war es möglich, um es von
>> v['b'].c.d
array(3)
InformationsquelleAutor der Frage mergen | 2011-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier sind die Funktionen, die rekonstruiert die Wörterbücher nutzen Sie einfach dieses loadmat anstelle von scipy.io ' s loadmat:
InformationsquelleAutor der Antwort mergen
Nur eine Erweiterung zu mergen Antwort, die leider aufhören wird recursing, wenn es erreicht ein cell array von Objekten. Die folgende version machen wird, die Listen von Ihnen statt, und die Fortsetzung der Rekursion in der Zell-array-Elemente, wenn möglich.
InformationsquelleAutor der Antwort jpapon
Lösung gefunden, kann man den Zugriff auf den Inhalt von "scipy.io.matlab.mio5_params.mat_struct Objekt" kann ermittelt werden über:
InformationsquelleAutor der Antwort mergen
Mir wurde geraten, auf der scipy-mailing-Liste (https://mail.python.org/pipermail/scipy-user/) , gibt es zwei weitere Möglichkeiten, auf diese Daten zuzugreifen.
Dies funktioniert:
Ausgabe auf meinem Rechner:
3
Den Grund für diese Art des Zugangs: "aus historischen Gründen, in Matlab-alles ist mindestens eine 2D-array, auch Skalare."
So scipy.io.loadmat imitiert Matlab-Verhalten standardmäßig.
InformationsquelleAutor der Antwort Nenad Propadović
Andere Methode, die funktioniert:
Ausgabe:
3
Habe ich gelernt, diese Methode auf die scipy-mailing-Liste zu. Ich sicherlich nicht verstehen, (noch) warum.Element()' Hinzugefügt, und:
wirft eine Fehlermeldung statt:
IndexError: nur ganze zahlen, Scheiben (
:
), Ellipse (...
), numpy.newaxis (None
) und integer-oder boolean-arrays der gültigen Indexpositionen, dieaber ich werde wieder zur Ergänzung der Erklärung, wenn ich es wissen. Erklärung von numpy.ndarray.Element (aus thenumpy Referenz):
Kopieren Sie ein element eines Arrays zu einem standard-Python-Skalare und gibt es zurück.
(Bitte beachten Sie, dass diese Antwort ist im Grunde das gleiche wie der Kommentar von hpaulj auf die ursprüngliche Frage, aber ich fühlte, dass der Kommentar ist nicht 'sichtbar' oder verständlich genug. Ich sicherlich nicht bemerken, wenn ich suchte nach einer Lösung für die erste Zeit, vor einigen Wochen).
InformationsquelleAutor der Antwort Nenad Propadović