【问题标题】:read matlab v7.3 file into python list of numpy arrays via h5py通过h5py将matlab v7.3文件读入numpy数组的python列表
【发布时间】:2015-02-24 12:49:28
【问题描述】:

我知道以前有人问过这个问题,但在我看来,仍然没有答案可以解释正在发生的事情,并且碰巧对我的情况不起作用。我有一个 matlab v7.3 文件,其结构如下,

           ---> rank <1x454 cell>    ---> each element is <53x50 double>
   f.mat
           ---> compare <1x454 cell> ---> each element is <53x50 double>

我希望这足够直截了当。所以我要做的是从名为“rank”的单元格数组中读取所有 454 个维度为 53x54 的数组,使用 h5py 库将其放入 python 中的 numpy 数组列表,如下所示:

import h5py

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

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

In [53]: data[0]
Out[53]: array([<HDF5 object reference>], dtype=object)

我该如何处理/如何获取我需要的数组列表?

【问题讨论】:

    标签: python matlab numpy h5py


    【解决方案1】:

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

    基本上,&lt;HDF5 object reference&gt; 需要用于索引 h5py 文件对象以获取被引用的底层数组。在我们引用所需的数组后,必须通过使用[:] 或任何子集(如果只需要数组的一部分)对其进行索引来将其加载到内存中。这就是我的意思:

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

    结果:

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

    希望这对将来的任何人都有帮助。我认为这是迄今为止我见过的最通用的解决方案。

    【讨论】:

      【解决方案2】:

      作为比较,我在 Octave 中创建并编写了:

      X = cell(1,10)
      for i = 1:10
         X{i}=ones(i,i)
      end
      save Xcell1 -hdf5 X
      

      然后在 Python 中:

      f=h5py.File('Xcell1','r')
      grp=f['X']
      grpv=grp['value']
      X=list(grpv.items())
      [x[1]['value'].value for x in X[:-1]]  # list of those 10 arrays
      
      X[-1][1].value # (10,1) the cell array shape
      

      或一行

      X = [f['/X/value/_0{}/value'.format(i)].value for i in range(0,10)]
      

      使用我为 https://stackoverflow.com/a/27699851/901925 编写的回调函数

      可以通过以下方式查看文件:

      f.visititems(callback)
      

      制作:

      name: X
      type: b'cell'
      name: X/value/_00
      type: b'scalar'
      1.0
      name: X/value/_01
      type: b'matrix'
      [[ 1.  1.]
       [ 1.  1.]]
      name: X/value/_02
      type: b'matrix'
      [[ 1.  1.  1.]
       [ 1.  1.  1.]
       [ 1.  1.  1.]]
      name: X/value/_03
      ...
      dims: [10  1]
      

      【讨论】:

      • 这可能有点简化,但如果您从八度保存,您可能可以使用 scipy.io.loadmat 代替(不支持从 matlab v7.3 保存的 .mat 文件然而)。
      • 对。 “V7”运行良好。但我有意研究如何通过 h5py 传递单元结构。
      【解决方案3】:

      试试 ma​​t73,效果很好。

      点安装 mat73

      import mat73
      data_dict = mat73.loadmat('train/digitStruct.mat')
      

      输出 -

      【讨论】:

        猜你喜欢
        • 2013-10-19
        • 1970-01-01
        • 2018-06-26
        • 2018-02-13
        • 2018-01-02
        • 2019-07-06
        • 1970-01-01
        • 2018-09-29
        • 1970-01-01
        相关资源
        最近更新 更多