Frage Ein Matlab-Zellenarray lesen, das als v7.3 .mat-Datei mit H5py gespeichert wurde


Ich habe ein Zell-Array als .mat-Datei in Matlab wie folgt gespeichert:

test = {'hello'; 'world!'};
save('data.mat', 'test', '-v7.3')

Wie kann ich es als die Liste der Zeichenfolgen in Python mit H5py importieren?

Ich habe es versucht

f = h5py.File('data.mat', 'r')
print f.get('test')
print f.get('test')[0]

Dies druckt aus:

<HDF5 dataset "test": shape (1, 2), type "|O8">
[<HDF5 object reference> <HDF5 object reference>]

Wie kann ich es dereferenzieren, um die Liste der Zeichenfolgen zu erhalten ['hello', 'world!'] in Python?


5
2018-02-01 02:04


Ursprung


Antworten:


Schreiben in Matlab:

test = {'Hello', 'world!'; 'Good', 'morning'; 'See', 'you!'};
save('data.mat', 'test', '-v7.3') % v7.3 so that it is readable by h5py

enter image description here

Lesen in Python (funktioniert für jede Zahl oder Zeilen oder Spalten, setzt aber voraus, dass jede Zelle eine Zeichenkette ist):

import h5py
import numpy as np

data = []
with h5py.File("data.mat") as f:
    for column in f['test']:
        row_data = []
        for row_number in range(len(column)):            
            row_data.append(''.join(map(unichr, f[column[row_number]][:])))   
        data.append(row_data)

print data
print np.transpose(data)

Ausgabe:

[[u'Hello', u'Good', u'See'], [u'world!', u'morning', u'you!']]

[[u'Hello' u'world!']
 [u'Good' u'morning']
 [u'See' u'you!']]

6
2018-02-01 05:08



Ich weiß, das ist eine alte Frage. Aber ich habe ein Paket gefunden, um das zu kratzen:

hdf5speicher

Es kann von pip installiert werden und funktioniert auf Python 3.6 sowohl für Pre- als auch Post 7.3-Matlab-Dateien. Für ältere Dateien ruft es auf scipy.io.loadmat nach den Unterlagen.


4
2018-02-24 16:14



Diese Antwort sollte als gesehen werden Zusatz auf Franck Dernoncourts Antwort, die für alle Zellenarrays, die 'flache' Daten enthalten, vollkommen ausreicht (für Mat-Dateien der Version 7.3 und wahrscheinlich darüber).

Ich stieß auf einen Fall, in dem ich hatte verschachtelte Daten (z. B. 1 Reihe von Zellenfeldern innerhalb eines benannten Zellenfeldes). Ich habe es geschafft, die Daten in die Hände zu bekommen, indem ich Folgendes machte:

# assumption:
# idx_of_interest specifies the index of the cell array we are interested in
# (at the second level)

with h5py.File(file_name) as f:
    data_of_interest_reference = f['cell_array_name'][idx_of_interest, 0]
    data_of_interest = f[data_of_interest_reference]

Grund dafür, dass dies für verschachtelte Daten funktioniert: Wenn Sie sich den Dateityp ansehen, den Sie auf einer tieferen Ebene abrufen möchten, heißt es:h5py.h5r.Referenz". Um die Daten, auf die die Referenzpunkte verweisen, tatsächlich abzurufen, müssen Sie Stellen Sie diesen Verweis auf das Dateiobjekt bereit.


3
2018-06-28 11:19