2017-09-04 3 views
1

Ich habe .mat Datei importieren, die 3 Matrices A, B, C.wie .mat-V7.3-Datei mit h5py

tatsächlich als unterhalb diese Matte Datei-I verwendet scipy.io zu importieren.

data = sio.loadmat('/data.mat') 
A = data['A'] 
B = data['B'] 
C = data['C'] 

Aber v7.3-Datei kann nicht auf diese Weise importieren verwenden. Also habe ich versucht, mit h5py zu importieren, aber ich weiß nicht, wie man h5py verwendet. Mein Code ist wie folgt.

f = h5py.File('/data.mat', 'r') 
A = f.get('/A') 
A = np.array('A') 

Welcher Teil ist falsch? Vielen Dank!

+0

Wir haben dies in früheren SO-Fragen untersucht. Aber in der Zwischenzeit, erkunden Sie die Datenstruktur der Datei. Sehen Sie sich 'f.keys()' an (fügen Sie 'list (...)' in py3 hinzu). Möglicherweise müssen Sie mehrere Ebenen bearbeiten. Lesen Sie auch die Grundlagen der Verwendung von 'h5py'. – hpaulj

+0

Von der Seitenleiste: https://stackoverflow.com/questions/19310808/how-to-read-a-v7-3-mat-file-via-h5py?rq=1 und https://stackoverflow.com/questions/27670149/read-matlab-v7-3-Datei-in-Python-Liste-von-Numpy-Arrays-via-h5py – hpaulj

Antwort

2

In Octave

>> A = [1,2,3;4,5,6]; 
>> B = [1,2,3,4]; 
>> save -hdf5 abc.h5 A B 

In IPython

In [138]: import h5py 
In [139]: f = h5py.File('abc.h5') 
In [140]: list(f.keys()) 
Out[140]: ['A', 'B'] 
In [141]: list(f['A'].keys()) 
Out[141]: ['type', 'value'] 
In [142]: f['A']['value'] 
Out[142]: <HDF5 dataset "value": shape (3, 2), type "<f8"> 
In [143]: A = f['A']['value'][:] 
In [144]: A 
Out[144]: 
array([[ 1., 4.], 
     [ 2., 5.], 
     [ 3., 6.]]) 

Siehe auch Links in der Seitenleiste.

Im Grunde ist es eine Frage von dem gewünschten Datensatz zu finden, und es dann, wie beschrieben Laden in http://docs.h5py.org/en/latest/high/dataset.html#reading-writing-data

https://pypi.python.org/pypi/hdf5storage/0.1.14 - Dieses Paket hat MATLAB MAT v7.3 file support. Ich habe es noch nicht benutzt.


In [550]: import hdf5storage 
In [560]: bar = hdf5storage.read(filename='abc.h5') 
In [561]: bar 
Out[561]: 
array([ ([(b'matrix', [[ 1., 4.], [ 2., 5.], [ 3., 6.]])], [(b'matrix', [[ 1.], [ 2.], [ 3.], [ 4.]])])], 
     dtype=[('A', [('type', 'S7'), ('value', '<f8', (3, 2))], (1,)), ('B', [('type', 'S7'), ('value', '<f8', (4, 1))], (1,))]) 

so dass die Datei wurde als strukturiertes Array geladen, mit Form (1,) und 2 Feldern, 'A' und 'B' (die 2 Variablennamen). Jeder hat seinerseits ein "type" - und ein "value" -Feld.

In [565]: bar['A']['value'] 
Out[565]: 
array([[[[ 1., 4.], 
     [ 2., 5.], 
     [ 3., 6.]]]]) 

Oder mit seiner loadmat:

In [570]: out = hdf5storage.loadmat('abc.h5',appendmat=False) 
In [571]: out 
Out[571]: 
{'A': array([(b'matrix', [[ 1., 4.], [ 2., 5.], [ 3., 6.]])], 
     dtype=[('type', 'S7'), ('value', '<f8', (3, 2))]), 
'B': array([(b'matrix', [[ 1.], [ 2.], [ 3.], [ 4.]])], 
     dtype=[('type', 'S7'), ('value', '<f8', (4, 1))])} 

out ist ein Wörterbuch:

In [572]: out['B']['value'] 
Out[572]: 
array([[[ 1.], 
     [ 2.], 
     [ 3.], 
     [ 4.]]]) 

Für eine einfache MATLAB-Datei liest diese nicht viel hinzuzufügen. Es kann mehr mit Zellen oder Strukturen hinzufügen. Aber für das Schreiben einer MATLAB-kompatiblen Datei sollte es eine große Hilfe sein (obwohl zum Schreiben könnte man bei scipy.io.savemat bleiben).