通过h5py将matlab v7.3文件读入到numpy数组的python列表中

pbr*_*ach 2 python matlab numpy h5py

我知道之前已经问过这个问题,但在我看来,仍然没有答案可以解释发生了什么事情并且没有碰巧为我的案例工作.我有一个像这样结构的matlab v7.3文件,

           ---> rank <1x454 cell>    ---> each element is <53x50 double>
   f.mat
           ---> compare <1x454 cell> ---> each element is <53x50 double>
Run Code Online (Sandbox Code Playgroud)

我希望这很直接.所以我要做的是从名为'rank'的单元格数组中读取尺寸为53x54的所有454个数组,使用h5py库将其读入python中的numpy数组列表,如下所示:

import h5py

with h5py.File("f.mat") as f:
    data = [np.array(element) for element in f['rank']]
Run Code Online (Sandbox Code Playgroud)

我最终得到的是一个HDF5对象引用数组列表:

In [53]: data[0]
Out[53]: array([<HDF5 object reference>], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我该怎么办/如何获得我需要的数组列表?

pbr*_*ach 11

好吧,我找到了解决问题的方法.如果其他人有更好的解决方案,或者可以更好地解释,我仍然希望听到它.

基本上,<HDF5 object reference>需要用于索引h5py文件对象以获取正在引用的基础数组.在我们引用所需的数组之后,[:]如果只需要部分数组,则必须通过索引或使用任何子集将其加载到内存中.这就是我的意思:

with h5py.File("f.mat") as f:
    data = [f[element[0]][:] for element in f['rank']]
Run Code Online (Sandbox Code Playgroud)

结果:

In [79]: data[0].shape
Out[79]: (50L, 53L)

In [80]: data[0].dtype
Out[80]: dtype('float64')
Run Code Online (Sandbox Code Playgroud)

希望这对未来的任何人都有帮助.我认为这是迄今为止我见过的最普遍的解决方案.