在 Matlab 中转置 Python 创建的 HDF5 数据集
Posted
技术标签:
【中文标题】在 Matlab 中转置 Python 创建的 HDF5 数据集【英文标题】:Python-created HDF5 dataset transposed in Matlab 【发布时间】: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
【问题讨论】:
【参考方案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)';
【讨论】:
以上是关于在 Matlab 中转置 Python 创建的 HDF5 数据集的主要内容,如果未能解决你的问题,请参考以下文章