10

我有一些在 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
4

3 回答 3

7

请参阅包含以下语句的Matlab HDF5 文档:

因为 HDF5 以行优先顺序存储数据,而 MATLAB 数组以列优先顺序组织,所以您应该颠倒维度范围的顺序......

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

于 2014-02-07T10:13:00.083 回答
7

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

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

$ h5ls 测试.h5
mydataset 数据集 {10, 30}
于 2014-02-07T10:16:37.057 回答
2

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

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

当使用 2D 数据时,只能转置h5read的结果

data = h5read(h5Filename,h5Dataset)';
于 2014-11-21T09:22:48.907 回答