8

我在用 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 表示。

有没有简单的方法可以把琴弦拿出来?

是否有任何软件包为 python hdf5 提供 matlab 支持?

4

2 回答 2

10

我假设您的意思是它是 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''''unichrby chr

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

于 2012-08-21T05:01:47.730 回答
3

Group您可以通过以下方式获取和Dataset对象的原始 Matlab 类名称

dataset.attrs['MATLAB_class']

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

于 2017-09-20T03:36:08.187 回答