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

标签 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)

(我还检查并确定对于 v7.3 matlab 文件,octave 与 h5py 具有类似的行为,但是 scipy.io.loadmat 和 Octave 对于较旧版本(>=v7)具有正确的行为.mat 文件。查看错误报告表明他们没有修复此问题或 v7.3 mat 文件的许多其他问题,而且他们根本不正式支持 v7.3)

我的问题是:当从该文件加载这些变量时,h5py 会忽略哪些数据或其他技巧来确定这些变量的类型?第二个问题是,是否有一个读取器的 python 实现可以进行此检查,无论用于做出此决定是什么?

最佳答案

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

strarr.attrs

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

关于python - .mat v7.3 文件中 char 和 uint16 编码之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36071390/

相关文章:

C++ HDF5 使用数据集的维度作为 const int

Python - 将 argparse 变量传递给类

python - 如何从生成的 Django 表单中删除文本?

python - urllib.request.Request 说参数无效

matlab - 基于反三角函数的成本函数

c - 在哪里可以获得 CRC(循环冗余校验)代码?

python - 在 Pandas 中查询 HDF5

python - MATLAB 的 fmincon 函数的开源替代方案?

objective-c - Objective-C 和 MATLAB/Octave 文件扩展名之间的重叠

python - 将大 csv 转换为 hdf5