【问题标题】:Python-created HDF5 dataset transposed in Matlab在 Matlab 中转置 Python 创建的 HDF5 数据集
【发布时间】:2014-03-04 16:22:18
【问题描述】:

我有一些数据在 Python 和 Matlab 之间共享。我曾经通过将 NumPy 数组保存在 MATLAB 样式的 .mat 文件中来做到这一点,但我想切换到 HDF5 数据集。但是,我注意到一个有趣的功能:当我将 NumPy 数组保存在 HDF5 文件中(使用 h5py)然后在 Matlab 中读取它(使用 h5read)时,它最终会被转置。我有什么遗漏吗?

Python 代码:

import numpy as np
import h5py

mystuff = np.random.rand(10,30)

f = h5py.File('/home/user/test.h5', 'w')
f['mydataset'] = mystuff
f.close()

Matlab 代码:

mystuff = h5read('/home/user/test.h5', '/mydataset');
size(mystuff) % 30 by 10

【问题讨论】:

    标签: python matlab numpy hdf5 h5py


    【解决方案1】:

    这是 Matlab 的 HDF5 阅读器例程中的一个怪癖。 (我认为这种行为背后的原因是:二进制文件中的数据是 C 顺序的,而 Matlab 数组是 Fortran 顺序的,所以他们应该将数据报告为转置而不是重新排序。)

    如果您使用 HDF5 工具检查 Python 创建的文件,尺寸应该是:

    $ h5ls 测试.h5 mydataset 数据集 {10, 30}

    【讨论】:

      【解决方案2】:

      查看Matlab HDF5 documentation,其中包含以下声明:

      因为 HDF5 以行优先顺序存储数据,而 MATLAB 数组是 按列主要顺序组织,您应该颠倒顺序 尺寸范围...

      即使在今天,在 Mathworks 将他们的代码翻译成 C(etc)很久之后,该产品的 Fortran 起源仍不时浮出水面。

      【讨论】:

        【解决方案3】:

        从 MatLab 读取数据时,需要置换读取数据的维度以检索数据布局。为此,使用了permute 函数。下面的代码给出了任意维数的一般情况

        rawdata = h5read(h5Filename,h5Dataset);
        ndim = numel(size(rawdata));
        data = permute(rawdata,[ndim:-1:1]);
        

        当使用二维数据时,只能转置来自h5read的结果

        data = h5read(h5Filename,h5Dataset)';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-27
          • 2018-02-22
          • 2019-02-04
          • 2015-11-13
          • 1970-01-01
          • 2021-11-09
          • 2013-02-26
          • 2012-11-22
          相关资源
          最近更新 更多