在 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 数据集的主要内容,如果未能解决你的问题,请参考以下文章

在.C中转置csv

python 在Pandas中转置数据(长到宽)

在python中转置(旋转)列表的字典[重复]

如何使用 python 在 Spark 中转置 DataFrame 而不进行聚合

如何在 hive 中转置/透视数据?

在Python中转置和乘以列表