read matlab v7.3 file into python list of numpy arrays via h5py

匿名 (未验证) 提交于 2019-12-03 02:54:01

问题:

I know this has been asked before but in my opinion there are still no answers that explain what is going on and don't happen to work for my case. I have a matlab v7.3 file that is structured like so,

           ---> rank     ---> each element is     f.mat            ---> compare  ---> each element is  

I hope this is straight forward enough. So what I am trying to do is read all 454 arrays with dimensions 53x54 from the cell array named 'rank', into a list of numpy arrays in python using the h5py library like so:

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

what I end up with is a list of arrays of HDF5 object references:

In [53]: data[0] Out[53]: array([], dtype=object) 

What do I do with this / how do I get the list of arrays that I need?

回答1:

Well I found the solution to my problem. If anyone else has a better solution or can better explain I'd still like to hear it.

Basically, the needed to be used to index the h5py file object to get the underlying array that is being referenced. After we are referring to the array that is needed, it has to be loaded to memory by indexing it with [:] or any subset if only part of the array is required. Here is what I mean:

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

and the result:

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

Hope this helps anyone in the future. I think this is the most general solution I've seen so far.



回答2:

Just by way of comparison, in Octave I created and wrote:

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

then in 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 

or in one line

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

With a callback function that I wrote for https://stackoverflow.com/a/27699851/901925

The file can be viewed with:

f.visititems(callback) 

producing:

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] 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!