我正在尝试使用以下代码读取matlab文件
import scipy.io
mat = scipy.io.loadmat('test.mat')
它给了我以下错误
raise NotImplementedError('Please use HDF reader for matlab v7.3 files')
NotImplementedError: Please use HDF reader for matlab v7.3 files
所以任何人都可以遇到同样的问题并且可以取悦任何示例代码
感谢
答案 0 :(得分:38)
尝试使用h5py
模块
import h5py
with h5py.File('test.mat', 'r') as f:
f.keys()
答案 1 :(得分:15)
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)
你应该在arrays
dict中得到你的数据,除非你有MATLAB结构,我怀疑。希望它有所帮助!
答案 2 :(得分:11)
Per Magu_'s answer on a related thread,查看包含便捷功能的包hdf5storage,以阅读v7.3 matlab mat文件;它就像
一样简单import hdf5storage
mat = hdf5storage.loadmat('test.mat')
答案 3 :(得分:8)
我看了一下这个问题:https://github.com/h5py/h5py/issues/726。如果您使用-v7.3
选项保存了mat文件,则应该使用(在Python 3.x下)生成密钥列表:
import h5py
with h5py.File('test.mat', 'r') as file:
print(list(file.keys()))
例如,为了访问变量a
,您必须使用相同的技巧:
with h5py.File('test.mat', 'r') as file:
a = list(file['a'])
答案 4 :(得分:5)
根据Scipy食谱。 http://wiki.scipy.org/Cookbook/Reading_mat_files,
从Matlab 7.3版开始,mat文件实际上是默认使用HDF5格式保存的(除非你在保存时使用-vX标志,请参阅Matlab中的帮助保存)。可以使用PyTables或h5py包在Python中读取这些文件。 此时似乎不支持在mat文件中阅读Matlab结构。
也许您可以使用Octave使用-vX标志重新保存。
答案 5 :(得分:2)
此函数读取Matlab生成的HDF5 .mat文件,并返回Numpy数组的嵌套字典的结构。 Matlab以Fortran顺序编写矩阵,因此也会将矩阵和高维数组转置为常规的Numpy顺序arr[..., page, row, col]
。
import h5py
def read_matlab(filename):
def conv(path=''):
p = path or '/'
paths[p] = ret = {}
for k, v in f[p].items():
if type(v).__name__ == 'Group':
ret[k] = conv(f'{path}/{k}') # Nested struct
continue
v = v[()] # It's a Numpy array now
if v.dtype == 'object':
# HDF5ObjectReferences are converted into a list of actual pointers
ret[k] = [r and paths.get(f[r].name, f[r].name) for r in v.flat]
else:
# Matrices and other numeric arrays
ret[k] = v if v.ndim < 2 else v.swapaxes(-1, -2)
return ret
paths = {}
with h5py.File(filename, 'r') as f:
return conv()
答案 6 :(得分:0)
尽管进行了数小时的搜索,但我也没有找到如何访问Matlab v7.3结构的方法。希望这个部分答案可以对某人有所帮助,并且我很高兴看到额外的提示。
因此,从(我认为[0] [0]源自Matlab赋予尺寸的一切):
f = h5py.File('filename', 'r')
f['varname'][0][0]
给出:
再次将此引用传递给f:
f[f['varname'][0][0]]
给出一个数组:
将其转换为numpy数组并提取值(或递归地,另一个
np.array(f[f['varname'][0][0]])[0][0]
如果访问磁盘的速度很慢,则也许加载到内存会有所帮助。
进一步编辑:在徒劳无功地搜索我的最终解决方法(我真的希望其他人有更好的解决方案!)之后,它是从python调用Matlab的,它非常容易且快速:
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)
答案 7 :(得分:0)
我已经创建了一个small library来加载MATLAB 7.3文件:
openapi: 3.0.1
info:
title: test
contact: {}
version: 2.1.0.46.c
servers:
- url: /
security:
- Custom: []
paths:
/consulter lien events:
get:
operationId: events
responses:
'200':
description: Status 200
content:
application/json:
schema:
$ref: '#/components/schemas/Test'
components:
schemas:
Test:
type: object
properties:
test:
$ref: '#/components/schemas/NonEmptyString'
NonEmptyString:
type: string
securitySchemes:
Custom:
type: apiKey
name: Cookie
in: header
要将case class Test(
test: Option[NonEmptyString]
)
7.3作为字典加载到Python中:
case class Test(
test: Option[String]
)
就这么简单!
答案 8 :(得分:0)
如果您只阅读基本数组和结构体,请参阅 vikrantt 的 answer 上类似的 post。但是,如果您使用的是 Matlab table
,那么恕我直言,最好的解决方案是完全避免使用 save
选项。
我创建了一个简单的辅助函数来将 Matlab table
转换为标准的 hdf5 文件,以及另一个 Python 中的辅助函数来将数据提取到 Pandas DataFrame
中。
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
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