将 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】:您可以通过以下方式获取Group
和Dataset
对象的原始Matlab类名
dataset.attrs['MATLAB_class']
如果dataset
包含一个字符串,它将返回b'char'
。
【讨论】:
以上是关于将 hdf5 matlab 字符串加载到 Python 中的主要内容,如果未能解决你的问题,请参考以下文章
使用 HDF5 保存要在 C++ 中读取的 MATLAB 结构
在 Matlab 中转置 Python 创建的 HDF5 数据集