将hdf5 matlab字符串加载到Python中

时间:2012-08-20 10:48:16

标签: python matlab hdf5

我在使用Python阅读hdf5 matlab 7.3文件时遇到了麻烦。 我正在使用h5py 2.0.1。

我可以读取存储在文件中的所有矩阵,但是我无法读取字符串列表。 h5py将字符串显示为类型为| 04的形状(1,894)的数据集。 此数据集包含对象引用,我尝试使用h5file[obj_ref]语法取消引用。

这会产生类似dataset "FFb": shape (4, 1) type "<u2"的内容。 我将其解释为长度为4的字符数组。这似乎是字符串的ASCII表示。

是否有一种简单的方法可以解决问题?

是否有任何包提供matlab到python hdf5支持?

2 个答案:

答案 0 :(得分:7)

我认为你的意思是它是MATLAB中的字符串单元格数组?此输出看起来很正常:数据集是一个对象数组(|O4是NumPy对象数据类型)。每个对象都是一个2字节整数的数组(<u2是NumPy little-endian无符号2字节整数数据类型)。 h5py无法知道数据集是字符串的单元格数组;它也可以是任意16位整数的单元阵列。

获取字符串的最简单方法是使用使用unichr的迭代器来转换字符,如下所示:

strlist = [u''.join(unichr(c) for c in h5file[obj_ref]) for obj_ref in dataset])

这样做是迭代数据集(for obj_ref in dataset)以创建新列表。对于每个对象引用,它取消引用对象(h5file[obj_ref])以获取整数数组。它将每个整数转换为一个字符(unichr(c)),并将这些字符连接成一个Unicode字符串(u''.join())。

请注意,这会生成一个unicode字符串列表。如果您完全确定每个字符串仅包含ASCII字符,则可以u''替换''unichr替换chr

警告:我没有h5py;这篇文章是基于我对MATLAB和NumPy的经验。您可能需要调整语法或迭代顺序以适应数据集。

答案 1 :(得分:0)

您可以通过

获取GroupDataset对象的原始Matlab类名称
dataset.attrs['MATLAB_class']

如果dataset包含字符串,则会返回b'char'