Python创建的HDF5数据集在Matlab中转置

时间:2014-02-07 10:02:28

标签: python matlab numpy hdf5 h5py

我有一些我在Python和Matlab之间共享的数据。我以前是通过在MATLAB风格的.mat文件中保存NumPy数组来实现的,但是想切换到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

3 个答案:

答案 0 :(得分:7)

请参阅包含声明的Matlab HDF5 documentation

  

因为HDF5以行主要顺序存储数据而MATLAB数组是   按列主要顺序组织,你应该颠倒它的顺序   维度范围......

即使在今天,在Mathworks将代码转换为C( etc )之后很久,产品的Fortran起源时不时地浮出水面。

答案 1 :(得分:7)

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

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

$ h5ls test.h5 
mydataset                Dataset {10, 30}

答案 2 :(得分:1)

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

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

当使用2D数据时,只能转换h5read

的结果
data = h5read(h5Filename,h5Dataset)';