【问题标题】:Loading hdf5 matlab strings into Python将 hdf5 matlab 字符串加载到 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支持的包?

【问题讨论】:

    标签: python matlab 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'

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 2017-02-07
      • 1970-01-01
      • 2013-11-23
      • 2011-01-18
      • 2014-06-06
      • 2019-01-04
      • 2014-11-14
      • 2017-05-19
      相关资源
      最近更新 更多