reading v 7.3 mat file in python

I am trying to read a matlab file with the following code

import scipy.io
mat = scipy.io.loadmat('test.mat')

and it gives me the following error

raise NotImplementedError('Please use HDF reader for matlab v7.3 files')
NotImplementedError: Please use HDF reader for matlab v7.3 files

so could anyone please had the same problem and could please any sample code

thanks

Answers


Try using h5py module

import h5py
with h5py.File('test.mat', 'r') as f:
    f.keys()

import h5py
import numpy as np
filepath = '/path/to/data.mat'
arrays = {}
f = h5py.File(filepath)
for k, v in f.items():
    arrays[k] = np.array(v)

you should end up with your data in the arrays dict, unless you have MATLAB structures, I suspect. Hope it helps!


Per Magu_'s answer on a related thread, check out the package hdf5storage which has convenience functions to read v7.3 matlab mat files; it is as simple as

import hdf5storage
mat = hdf5storage.loadmat('test.mat')

I had a look at this issue: https://github.com/h5py/h5py/issues/726. If you saved your mat file with -v7.3 option, you should generate the list of keys with (under Python 3.x):

import h5py
with h5py.File('test.mat', 'r') as file:
    print(list(file.keys()))

In order to access the variable a for instance, you have to use the same trick:

with h5py.File('test.mat', 'r') as file:
    a = list(file['a'])

According to the Scipy cookbook. http://wiki.scipy.org/Cookbook/Reading_mat_files,

Beginning at release 7.3 of Matlab, mat files are actually saved using the HDF5 format by default (except if you use the -vX flag at save time, see help save in Matlab). These files can be read in Python using, for instance, the PyTables or h5py package. Reading Matlab structures in mat files does not seem supported at this point.

Perhaps you could use Octave to re-save using the -vX flag.


Despite hours of searching I've not found how to access Matlab v7.3 structures either. Hopefully this partial answer will help someone, and I'd be very happy to see extra pointers.

So starting with (I think the [0][0] arises from Matlab giving everything to dimensions):

f = h5py.File('filename', 'r')
f['varname'][0][0]

gives: < HDF5 object reference >

Pass this reference to f again:

f[f['varname'][0][0]]

which gives an array: convert this to a numpy array and extract the value (or, recursively, another < HDF5 object reference > :

np.array(f[f['varname'][0][0]])[0][0]

If accessing the disk is slow, maybe loading to memory would help.


Further edit: after much futile searching my final workaround (I really hope someone else has a better solution!) was calling Matlab from python which is pretty easy and fast:

eng = matlab.engine.start_matlab()  # first fire up a Matlab instance
eng.quit()
eng = matlab.engine.connect_matlab()  # or connect to an existing one
eng.sqrt(4.0)
x = 4.0
eng.workspace['y'] = x
a = eng.eval('sqrt(y)')
print(a)
x = eng.eval('parameterised_function_in_Matlab(1, 1)', nargout=1)
a = eng.eval('Structured_variable{1}{2}.object_name')  # (nested cell, cell, object)

This got the job done for me:

import numpy as np
import h5py

def conv(obj):
    ret = {}
    for k, v in obj.items():
        if hasattr(v, "items"):
            # Nested dicts
            ret[k] = conv(v)
        elif hasattr(v, "shape"):
            # Arrays a Numpy arrays
            ret[k] = np.array(v)
        else:
            # I haven't seen other types, but just in case:
            ret[k] = v
    return ret

with h5py.File('e1_eegmodel.mat', 'r') as f:
    eegmodel = conv(f)

Need Your Help

Set Matplotlib colorbar size to match graph

python image matplotlib

I cannot get the colorbar on imshow graphs like this one to be the same height as the graph, short of using Photoshop after the fact. How do I get the heights to match?

In app auto-renewable subscriptions

iphone in-app-purchase

Sorry for the millionth question about iTunes subscriptions, but I still have a few doubts.