Ich versuche, eine .mat-Datei in Python zu laden. Die Datei wurde wie folgt erstellt:laden verschachtelt defaultdict mit scipy.loadmat
import collections
import scipy.io
out_o = collections.defaultdict(list)
out_t = collections.defaultdict(list)
out_o['o1'] = {'x':[1,2,3], 'y':[4,5,6]}
out_o['o2'] = {'x':[7,8,9], 'y':[10,11,12]}
out_t['t'] = out_o
scipy.io.savemat('test.mat', out_t)
Wie kann ich out_t
aus der Datei rekonstruieren test.mat
ohne harte Codierung der Schlüssel out_o
?
ich es geschafft, die Schlüssel zu bekommen mit:
input = scipy.io.loadmat('test.mat', squeeze_me=True, struct_as_record=True)
print(list(input['t'].dtype.names))
[ 'o2', 'o1']
Aber wie greife ich auf die Daten?
print(input['t'])
Drucke:
((Array ([7, 8, 9]), array ([10, 11, 12])), (Array ([1, 2, 3]), array ([4, 5, 6])))
Das ist so nah wie ich
zux
und
y
... erhalten verwalten
edit:
Dank hpauljs Antwort gelang es mir, mein Problem zu lösen.
Ich konnte nicht hart codieren die oi
s, so habe ich dtype.fields.keys()
:
input = scipy.io.loadmat('test.mat')
objs = list(input['t'].dtype.fields.keys())
in_o = collections.defaultdict(list)
in_t = collections.defaultdict(list)
for i in objs:
in_o[i]={'x': list(input['t'][i][0,0]['x'][0,0][0]),'y': list(input['t'][i][0,0]['y'][0,0][0])}
in_t['t'] = in_o
print(in_t == out_t)
Was erhalten Sie ohne den Parameter 'struct_as_record'? 'savemat' komprimiert die Daten in Matlab-kompatible Strukturen. Es ist nicht dazu gedacht, Python-Pickel zu "pürieren". – hpaulj