我知道之前已经问过这个问题,但在我看来,仍然没有答案可以解释发生了什么事情并且不适合我的情况。我有一个像这样结构的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)
我该怎么做/如何获得我需要的数组列表?
答案 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)