.mat v7.3文件中char和uint16的编码之间的差异

时间:2016-03-17 20:48:36

标签: python matlab hdf5 h5py mat-file

我正在尝试使用h5py在python文件中阅读v7.3 matlab .mat。

我遇到的问题是字符数组(例如,通常包含单个字符串的.mat字段)和uint16数组的表示看起来相同。

>> ushortarr = uint16([63 109 105 102])
>> strarr = 'gibl'
>> save('short_string_difference.mat', 'ushortarr', 'strarr', '-v7.3')

当加载回matlab时,matlab能够检测到这些变量的正确数据类型:

>> ss73 = load('short_string_difference.mat')
ss73 =
       strarr: 'gibl'
       ushortarr: [69 109 105 102]

但是h5py表明该文件的结构如下:

(Pdb) strarr
<HDF5 dataset "strarr": shape (4, 1), type "<u2">
(Pdb) ushortarr
<HDF5 dataset "ushortarr": shape (4, 1), type "<u2">
(Pdb) strarr.value
array([[103],
       [105],
       [ 98],
       [108]], dtype=uint16)
(Pdb) ushortarr.value
array([[ 69],
       [109],
       [105],
       [102]], dtype=uint16)

(我还检查并确定octave与v5.3 matlab文件的h5py具有相似的行为,但scipy.io.loadmat和octave对旧的&gt; = v7 .mat文件都有正确的行为。错误报告表明他们没有解决这个或v7.3 mat文件的其他一些问题,并且他们根本没有正式支持v7.3)

我的问题是:h5py忽略的数据或其他技巧是matlab用来确定这些变量从这个文件加载时的类型?第二个问题是,是否有一个读者的python实现可以检查用于做出此决定的任何内容?

1 个答案:

答案 0 :(得分:2)

您必须查看属性,可以通过以下方式访问:

strarr.attrs

在那里,您会找到一个名为MATLAB_class的属性charuint16