在Python中加载HDF5 Matlab字符串

8
我在使用h5py 2.0.1时遇到了读取Python中hdf5 matlab 7.3文件的问题。
我可以读取文件中存储的所有矩阵,但无法读取字符串列表。 h5py将字符串显示为一个形状为(1, 894),类型为|04的数据集。 该数据集包含对象引用,我尝试使用语法对其进行解引用。
这会产生类似于的结果。 我将其解释为长度为四的字符数组。这似乎是字符串的ASCII表示形式。
是否有一种简单的方法来获取字符串?
是否有任何提供matlab到python hdf5支持的软件包?
2个回答

11

我假设你指的是MATLAB中的字符串单元数组?这个输出看起来很正常:数据集是一个对象数组(|O4 是NumPy对象数据类型)。每个对象都是一个2字节整数数组(<u2 是NumPy小端无符号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
你说得对,我忘记了这里没有列表。它必须是一个单元数组。有没有办法指定特定数据集的类型为字符串?或者 Matlab 就是不支持这个功能?但是 Matlab 知道这些是字符串,所以它们一定以某种方式存储在 hdf5 中。你的代码行看起来不错,只是我希望还有其他方法。 - Andreas Mueller
这个问题很老了,但是你有没有找到一个好的解决方案,@AndreasMueller?(除了编写自己的函数来实现上述代码之外) - choldgraf
我不认为我找到了一个,至少我记不起来了 ;) - Andreas Mueller

4

您可以通过以下方式获取GroupDataset对象的原始Matlab类名:

dataset.attrs['MATLAB_class']

如果 dataset 包含一个字符串,它将返回 b'char'


检查类型后,您如何访问字符串? - Xue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接