我在使用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支持?
答案 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)
您可以通过
获取Group
和Dataset
对象的原始Matlab类名称
dataset.attrs['MATLAB_class']
如果dataset
包含字符串,则会返回b'char'
。