17

matlab によって作成され、v7.3 形式のマット ファイルに格納されている構造体配列があります。

struArray = struct('name', {'one', 'two', 'three'}, 
                   'id', {1,2,3}, 
                   'data', {[1:10], [3:9], [0]})
save('test.mat', 'struArray', '-v7.3')

ここで、h5py を使用して Python 経由でこのファイルを読みたいと思います。

data = h5py.File('test.mat')
struArray = data['/struArray']

構造体データを 1 つずつ取得する方法がわかりませんstruArray

for index in range(<the size of struArray>):
    elem = <the index th struct in struArray>
    name = <the name of elem>
    id = <the id of elem>
    data = <the data of elem>
4

6 に答える 6

3

visitまたは、ファイルvisititemsの全体的な構造をすばやく確認できます。h5py

fs['struArray'].visititems(lambda n,o:print(n, o))

Octave によって生成されたファイルでこれを実行すると、次のsave -hdf5ようになります。

type <HDF5 dataset "type": shape (), type "|S7">
value <HDF5 group "/struArray/value" (3 members)>
value/data <HDF5 group "/struArray/value/data" (2 members)>
value/data/type <HDF5 dataset "type": shape (), type "|S5">
value/data/value <HDF5 group "/struArray/value/data/value" (4 members)>
value/data/value/_0 <HDF5 group "/struArray/value/data/value/_0" (2 members)>
value/data/value/_0/type <HDF5 dataset "type": shape (), type "|S7">
value/data/value/_0/value <HDF5 dataset "value": shape (10, 1), type "<f8">
value/data/value/_1 <HDF5 group "/struArray/value/data/value/_1" (2 members)>
...
value/data/value/dims <HDF5 dataset "dims": shape (2,), type "<i4">
value/id <HDF5 group "/struArray/value/id" (2 members)>
value/id/type <HDF5 dataset "type": shape (), type "|S5">
value/id/value <HDF5 group "/struArray/value/id/value" (4 members)>
value/id/value/_0 <HDF5 group "/struArray/value/id/value/_0" (2 members)>
...
value/id/value/_2/value <HDF5 dataset "value": shape (), type "<f8">
value/id/value/dims <HDF5 dataset "dims": shape (2,), type "<i4">
value/name <HDF5 group "/struArray/value/name" (2 members)>
...
value/name/value/dims <HDF5 dataset "dims": shape (2,), type "<i4">

これは、MATLAB 7.3 が生成するものと同じではないかもしれませんが、構造の複雑さのアイデアを提供します。

より洗練されたコールバックは値を表示でき、Python オブジェクト (辞書、リストなど) を再作成するための開始点になる可能性があります。

def callback(name, obj):
    if name.endswith('type'):
        print('type:', obj.value)
    elif name.endswith('value'):
        if type(obj).__name__=='Dataset':
            print(obj.value.T)  # http://stackoverflow.com/questions/21624653
    elif name.endswith('dims'):
        print('dims:', obj.value)
    else:
        print('name:', name)

fs.visititems(callback)

生成:

name: struArray
type: b'struct'
name: struArray/value/data
type: b'cell'
name: struArray/value/data/value/_0
type: b'matrix'
[[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.]]
name: struArray/value/data/value/_1
type: b'matrix'
[[ 3.  4.  5.  6.  7.  8.  9.]]
name: struArray/value/data/value/_2
type: b'scalar'
0.0
dims: [3 1]
name: struArray/value/id
type: b'cell'
name: struArray/value/id/value/_0
type: b'scalar'
1.0
...
dims: [3 1]
name: struArray/value/name
type: b'cell'
name: struArray/value/name/value/_0
type: b'sq_string'
[[111 110 101]]
...
dims: [3 1]
于 2014-12-30T05:05:48.940 に答える
0

申し訳ありませんが、Matlab の外部からセル/構造の内容を取得するのはかなり難しいと思います。生成されたファイルを (たとえば HDFView で) 表示すると、多くの相互参照があり、先に進む方法が明らかでないことがわかります。

単純な数値配列に固執すると、うまく機能します。数値配列を含む小さな cell 配列がある場合は、それらを個別の変数 (つまり、cellcontents1、cellcontents2 など) に変換できます。これは通常、数行で、直接保存およびロードできます。したがって、あなたの例では、varsname1, name2, name3, id1, id2, id3 ...などでファイルを保存します.

編集:質問で h5py を指定したので、それが私が答えたものですがscipy.io.loadmat、元の変数をnumpyの同等物(オブジェクト配列など)に変換できるはずであることに言及する価値があります。

于 2013-10-11T07:54:21.357 に答える