2014-02-07 31 views
7

我有一些我在Python和Matlab之间共享的数据。我曾经这样做过,通过将NumPy数组保存在MATLAB风格的.mat文件中,但希望切换到HDF5数据集。不过,我注意到一个有趣的特性:当我将一个NumPy数组保存在HDF5文件中(使用h5py),然后在Matlab中读取(使用h5read)时,它最终被转置。有什么我失踪?在Matlab中转置的Python创建的HDF5数据集

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 

回答

6

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

如果您检查通过Python和HDF5工具创建的文件,该尺寸应该是什么:

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

Matlab HDF5 documentation包括以下语句:

由于HDF5将数据存储在行主顺序和MATLAB数组是 按列主要顺序组织,您应该颠倒的顺序米尺寸范围...

即使在今天,很久之后Mathworks公司的翻译他们的代码,以C(),该产品的Fortran语言的起源现在再拨开表面之上。

1

当读取从MATLAB数据,数据的读取尺寸需要被排列检索数据的布局。为此,使用permute函数。下面的代码给出的一般情况下与任何数目的维度

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

当一个与2D数据的工作,一个只能从h5read

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