Python load mat file v7 3

If you are only reading in basic arrays and structs, see vikrantt's answer on a similar post. However, if you are working with a Matlab table, then IMHO the best solution is to avoid the save option altogether.

I've created a simple helper function to convert a Matlab table to a standard hdf5 file, and another helper function in Python to extract the data into a Pandas DataFrame.

Matlab Helper Function

function table_to_hdf5(T, path, group)
%TABLE_TO_HDF5 Save a Matlab table in an hdf5 file format
%
%    TABLE_TO_HDF5(T) Saves the table T to the HDF5 file inputname.h5 at the root ('/')
%    group, where inputname is the name of the input argument for T
%
%    TABLE_TO_HDF5(T, path) Saves the table T to the HDF5 file specified by path at the
%    root ('/') group.
%
%    TABLE_TO_HDF5(T, path, group) Saves the table T to the HDF5 file specified by path
%    at the group specified by group.
%
%%%

if nargin < 2
    path = [inputname(1),'.h5'];  % default file name to input argument
end
if nargin < 3
    group = '';  % We will prepend '/' later, so this is effectively root
end

for field = T.Properties.VariableNames
    % Prepare to write
    field = field{:};
    dataset_name = [group '/' field];
    data = T.(field);
    if ischar(data) || isstring(data)
        warning('String columns not supported. Skipping...')
        continue
    end
    % Write the data
    h5create(path, dataset_name, size(data))
    h5write(path, dataset_name, data)
end

end

Python Helper Function

import pandas as pd
import h5py


def h5_to_df(path, group = '/'):
"""
Load an hdf5 file into a pandas DataFrame
"""
    df = pd.DataFrame()
    with h5py.File(path, 'r') as f:
        data = f[group]
        for k,v in data.items():
            if v.shape[0] > 1:  # Multiple column field
                for i in range(v.shape[0]):
                    k_new = f'{k}_{i}'
                    df[k_new] = v[i]
            else:
                df[k] = v[0]
    return df

Important Notes

  • This will only work on numerical data. If you know how to add string data, please comment.
  • This will create the file if it does not already exist.
  • This will crash if the data already exists in the file. You'll want to include logic to handle those cases as you deem appropriate.

Project description

Python load mat file v7 3

mat 7.3

Load MATLAB 7.3 .mat files into Python.

Starting with MATLAB 7.3, .mat files have been changed to store as custom hdf5 files. This means they cannot be loaded by scipy.io.loadmat any longer and raise.

NotImplementedError: Please use HDF reader for matlab v7.3 files

Quickstart

This library loads MATLAB 7.3 HDF5 files into a Python dictionary.

import mat73
data_dict = mat73.loadmat('data.mat')

As easy as that!

By enabling use_attrdict=True you can even access sub-entries of structs as attributes, just like in MATLAB:

data_dict = mat73.loadmat('data.mat', use_attrdict=True) 
struct = data_dict['structure'] # assuming a structure was saved in the .mat
struct[0].var1 == struct[0]['var1'] # it's the same!

You can also specifiy to only load a specific variable or variable tree, useful to reduce loading times

data_dict = mat73.loadmat('data.mat', only_include='structure') 
struct = data_dict['structure'] # now only structure is loaded and nothing else

data_dict = mat73.loadmat('data.mat', only_include=['var/subvar/subsubvar', 'tree1/']) 
tree1 = data_dict['tree1'] # the entire tree has been loaded, so tree1 is a dict with all subvars of tree1
subsubvar = data_dict['var']['subvar']['subsubvar'] # this subvar has been loaded

Installation

To install, run:

pip install mat73

Alternatively for most recent version:

pip install git+https://github.com/skjerns/mat7.3

Datatypes

The following MATLAB datatypes can be loaded

MATLABPython
logical np.bool_
single np.float32
double np.float64
int8/16/32/64 np.int8/16/32/64
uint8/16/32/64 np.uint8/16/32/64
complex np.complex128
char str
struct list of dicts
cell list of lists
canonical empty []
missing None
Other (ie Datetime, ...) Not supported

Short-comings

  • This library will only load mat 7.3 files. For older versions use scipy.io.loadmat
  • Proprietary MATLAB types (e.g datetime, duriation, etc) are not supported. If someone tells me how to convert them, I'll implement that
  • For now, you can't save anything back to the .mat. It's a bit more difficult than expected, so it's not on the roadmap for now
  • See also hdf5storage, which can indeed be used for saving .mat, but has less features for loading

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Built Distribution

How do I load a .MAT dataset in Python?

mat file in Python..
Install the package: pip install pymatreader..
Import the relevant function of this package: from pymatreader import read_mat..
Use the function to read the matlab struct: data = read_mat('matlab_struct. mat').
use data. keys() to locate where the data is actually stored..

Can Python import .MAT files?

Matlab 7.3 and greater 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 in Matlab). These files can be read in Python using, for instance, the PyTables or h5py package.

How do I show a .MAT file in Python?

Importing Matlab files with Scipy.
In [1]: import scipy.io..
# Import to a python dictionary mat = scipy. io. loadmat('../input/Dataset_PerCom18_STL/Dataset_PerCom18_STL/cross_opp.mat').
# Look at the dictionary items mat. items() Out[3]: ... .
# Print the data mat["data_opp"] Out[4]:.

Are .MAT files HDF5?

Matlab(tm) 7.3 file format is actually hdf5 and can be read from other languages like python.