파이썬에서 .mat 파일 읽기


383

파이썬에서 이진 MATLAB .mat 파일을 읽을 수 있습니까?

SciPy가 .mat 파일 읽기를 지원한다고 주장했지만 성공하지 못했습니다. SciPy 버전 0.7.0을 설치했는데 loadmat()방법을 찾을 수 없습니다 .

답변:


517

수입이 필요합니다 import scipy.io...

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


18
scipy는 v7.3 매트 파일을 지원하지 않습니다 ( 여기 참고 참조 ). 해결책은 vikrantt답변을 참조하십시오 .
texnic

그러나 매트 파일을 이전 버전으로 저장할 수 있습니다. 참조 : mathworks.com/help/matlab/import_export/mat-file-versions.html (헤더 : '기본이 아닌 MAT 파일 버전으로 저장')
watsonic

5
save('myfile.mat','-v7')
watsonic

149

어느 scipy.io.savemat없으며, scipy.io.loadmatMATLAB 배열 버전 7.3에 대한 작업. 그러나 MATLAB 버전 7.3 파일은 hdf5 데이터 세트라는 것이 좋습니다. 따라서 NumPy를 포함한 여러 도구를 사용하여 읽을 수 있습니다 .

Python의 경우 h5py시스템에 HDF5 가 필요한 확장 이 필요합니다 .

import numpy as np
import h5py
f = h5py.File('somefile.mat','r')
data = f.get('data/variable1')
data = np.array(data) # For converting to a NumPy array

6
데이터를 저장할 때 Matlab에서 '-v7.3'플래그를 사용하면 올바르게 작동합니다. 기본값을 사용하면 save(적어도 Matlab R2014b에서) 위의 기술로는 읽을 수없는 파일이 생성됩니다. '-v7.3'플래그를 사용하면 숫자 데이터를 잘 읽을 수 있습니다.
chipaudette

3
그렇습니다, 그것은 내가 내 게시물에서 말한 것입니다. Matlab에 저장하는 동안 -v7.3을 사용해야합니다. 어쨌든 더 나은 / 더 지원 / 표준화 된 형식을 사용하기 때문에 그렇게해야합니다.
커트

4
예제에서 f데이터 의 관계가 무엇인지 설명해 주 시겠습니까? f 를 numpy 배열 로 어떻게 옮길 수 있습니까?
heracho 2016

프롬프트에서이 명령으로 변수를 저장하십시오.save('filename', '-v7.3', 'var1');
Kevin Katzke

23

먼저 .mat 파일을 다음과 같이 저장하십시오.

save('test.mat', '-v7')

그 후 파이썬에서는 일반적인 loadmat함수를 사용하십시오 .

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

15

다음을 mat4py사용하여 쉽게 설치할 수 있는 멋진 패키지 가 있습니다.

pip install mat4py

웹 사이트에서 사용하는 것이 간단합니다.

MAT 파일에서 데이터로드

이 함수 loadmat는 MAT 파일에 저장된 모든 변수를 Python dictlist객체 만 사용하여 간단한 Python 데이터 구조로로드 합니다. 숫자 형 배열과 셀형 배열은 행 순서로 중첩 된 목록으로 변환됩니다. 하나의 요소 만있는 배열을 제거하기 위해 배열을 압착합니다. 결과 데이터 구조는 JSON 과 호환되는 간단한 유형으로 구성됩니다. 형식 됩니다.

예 : Python 데이터 구조에 MAT 파일을로드하십시오.

from mat4py import loadmat

data = loadmat('datafile.mat')

변수 datadictMAT 파일에 포함 된 변수와 값 이있는 a 입니다.

Python 데이터 구조를 MAT 파일에 저장

Python 데이터는 함수를 사용하여 MAT 파일에 저장할 수 있습니다 savemat. 데이터와 동일한 방식으로 구성되어야한다 loadmat, 그것이 단순 데이터 타입들로 구성되어야한다, 즉 같은 dict, list, str, int, 및float .

예 : Python 데이터 구조를 MAT 파일에 저장하십시오.

from mat4py import savemat

savemat('datafile.mat', data)

변수 datadict변수와 함께 있어야합니다.


mat4py는 json과 같은 dicts, list, list of list ...를 제공합니다. ( mat4py/cmd.py my.mat쓰기 my.json, 1 긴 줄.)
데니스

1
@denis : 예, 위에서도 언급했습니다. 그러나 좋은 지적 : 실제로는 numpy 배열이 JSON 직렬화 가능하지 않기 때문에 웹 구조에서 일반적 으로이 구조를 좋아합니다 .
Cleb

발생 :mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
s2t2

@ s2t2 : 전에이 문제가 발생하지 않았습니다. 어떤 matlab 버전과 어떤 scipy 버전을 사용하고 있습니까?
Cleb

ParseError : 예기치 않은 필드 이름 길이 : 43
Aleksejs Fomins

13

MATLAB 2014b 이상을 설치하면 Python 용 MATLAB 엔진을 사용할 수 있습니다.

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)

이 오류가 발생했습니다 : ModuleNotFoundError : 'pylab'이라는 모듈이 없습니다.
비가

3
이 답변을 시도 할 때 오류가 발생 했습니까? 그것은 pylab을 사용하지 않는 것이 이상합니다.
Daniel

11

파일 읽기

import scipy.io
mat = scipy.io.loadmat(file_name)

MAT 변수의 유형 검사

print(type(mat))
#OUTPUT - <class 'dict'>

사전 내부 의 MATLAB 변수 이고 해당 변수에 지정된 객체 입니다.


7

파이썬 용 MATLAB 엔진 도 있습니다MathWorks 자체의 있습니다. MATLAB이 있다면 고려해 볼 가치가 있습니다 (내가 직접 시도하지는 않았지만 MATLAB 파일을 읽는 것보다 훨씬 더 많은 기능을 가지고 있습니다). 그러나 다른 사용자에게 배포 할 수 있는지 여부는 알 수 없습니다 (MATLAB이 있으면 문제가되지 않습니다. 그렇지 않으면 NumPy가 올바른 방법 일 수 있습니다).

또한 모든 기본 사항을 직접 수행하려는 경우 MathWorks는 파일 형식의 구조에 대한 자세한 문서를 제공합니다 (링크가 변경되면 Google에 matfile_format.pdf제목이나 제목을 입력하십시오 MAT-FILE Format). 개인적으로 생각하는 것만 큼 복잡하지는 않지만 분명히 가장 쉬운 방법은 아닙니다. 그것은 또한 얼마나 많은 기능에 의존.mat 지원하려는 -file의 .

기본 파일을 읽을 수있는 "작은"(약 700 줄) Python 스크립트를 작성했습니다 .mat. 저는 파이썬 전문가도 초보자도 아니며, 위에 링크 된 MathWorks 문서를 사용하여 작성하는 데 약 이틀이 걸렸습니다. 나는 많은 새로운 것들을 배웠고 꽤 재미있었습니다. 직장에서 Python 스크립트를 작성 했으므로 게시 할 수 없습니다 ... 그러나 여기에 조언을 해줄 수 있습니다.

  • 먼저 설명서를 읽으십시오.
  • 16 진 편집기 (예 : HxD ) .mat를 사용하여 구문 분석 할 참조 파일을 찾으십시오 .
  • 바이트를 .txt 파일에 저장하고 각 줄에 주석을 달아 각 바이트의 의미를 알아 봅니다.
  • (예 : 각 데이터 요소를 저장하는 클래스를 사용하여 miCOMPRESSED, miMATRIX, mxDOUBLE, 또는 miINT32)
  • .mat-files '구조는 트리 데이터 구조의 데이터 요소를 저장하기에 적합하다; 각 노드에는 하나의 클래스와 하위 노드가 있습니다

9
그것은 mathworks가 제공하는 다소 미친 문서입니다. 형식이 HDF5의 하위 집합임을 언급하지 않고 40 페이지를 설명합니다.
Daniel

-1
from os.path import dirname, join as pjoin
import scipy.io as sio
data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data')
mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
mat_contents = sio.loadmat(mat_fname)

위의 코드를 사용하여 Python에서 저장된 기본 .mat 파일을 읽을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.