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

时间:2014-12-27 18:18:16

标签: 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>

我希望这很直接。所以我要做的是将所有454个数组(尺寸为53x54)从名为&#39; rank&#39;的单元格数组中读取到使用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)

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

3 个答案:

答案 0 :(得分:11)

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

基本上,<HDF5 object reference>需要用于索引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')

希望这有助于将来的任何人。我认为这是迄今为止我见过的最普遍的解决方案。

答案 1 :(得分:1)

仅仅通过比较,在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]

答案 2 :(得分:0)

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

pip 安装 mat73

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

输出 - enter image description here