将 hdf5 matlab 字符串加载到 Python 中

Posted

技术标签:

【中文标题】将 hdf5 matlab 字符串加载到 Python 中【英文标题】:Loading hdf5 matlab strings into Python 【发布时间】:2012-08-15 16:52:38 【问题描述】:

我在使用 Python 读取 hdf5 matlab 7.3 文件时遇到问题。 我正在使用 h5py 2.0.1。

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

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

有没有一种简单的方法可以取出字符串?

有没有提供matlab到python hdf5支持的包?

【问题讨论】:

【参考方案1】:

我假设您的意思是它是 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 的经验。您可能需要调整语法或迭代顺序以适应您的数据集。

【讨论】:

你说得对,我忘了没有列表。它必须是一个单元阵列。有没有办法说一个特定的数据集是字符串类型的?或者Matlab只是不这样做?但是 matlab 知道这些是字符串,所以它必须以某种方式存储在 hdf5 中。你的台词看起来不错,我只是希望有另一种方式。 这已经很老了——但你有没有找到解决这个问题的好方法@AndreasMueller? (除了编写自己的实现上述代码的函数) 我不认为我找到了,至少我不记得了;)【参考方案2】:

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

dataset.attrs['MATLAB_class']

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

【讨论】:

以上是关于将 hdf5 matlab 字符串加载到 Python 中的主要内容,如果未能解决你的问题,请参考以下文章

用 Matlab 加载 HDF5 [关闭]

使用 HDF5 保存要在 C++ 中读取的 MATLAB 结构

在 Matlab 中转置 Python 创建的 HDF5 数据集

将 hdf5 文件加载到 python xarrays

如何在 Matlab 中的 HDF5 属性字符串中放置换行符

将经过训练的 HDF5 模型加载到 Rust 中以进行预测