개발/Python

[파이썬] mat 파일 읽는 방법

MinorMan 2023. 8. 11. 19:36
반응형

<질문>

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

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


<답변1>

가져오기가 필요합니다.import scipy.io...

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

<답변2>

어느 것도 아니다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

<답변3>

먼저 .mat 파일을 다음과 같이 저장합니다.

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

그 후 Python에서 일반적인loadmat기능:

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

<답변4>

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

pip install mat4py

사용이 간단합니다(웹사이트에서):

MAT 파일에서 데이터 불러오기

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

예: MAT 파일을 Python 데이터 구조로 로드합니다.

from mat4py import loadmat

data = loadmat('datafile.mat')

변수data이다dictMAT 파일에 포함된 변수와 값을 사용합니다.

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

다음 함수를 사용하여 Python 데이터를 MAT 파일에 저장할 수 있습니다.savemat. 데이터는 다음과 같은 방식으로 구성되어야 합니다.loadmat즉, 다음과 같은 간단한 데이터 유형으로 구성되어야 합니다.dict,list,str,int, 그리고float.

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

from mat4py import savemat

savemat('datafile.mat', data)

매개변수data될 것이다dict변수와 함께.


<답변5>

MATLAB 2014b 이상이 설치된 경우MATLAB engine for Python사용 될수있다:

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

<답변6>

파일 읽기

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

MAT 변수의 유형 검사

print(type(mat))
#OUTPUT - 

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


<답변7>

이 작업을 위한 다음과 같은 훌륭한 라이브러리가 있습니다.pymatreader.

다음과 같이 하십시오.

  1. 패키지 설치: pip install pymatreader

  2. 이 패키지의 관련 기능 가져오기: from pymatreader import read_mat

  3. 다음 함수를 사용하여 matlab 구조체를 읽습니다. data = read_mat('matlab_struct.mat')

  4. data.keys() 사용하여 데이터가 실제로 저장된 위치를 찾습니다.

  • 키는 일반적으로 다음과 같습니다.dict_keys(['__header__', '__version__', '__globals__', 'data_opp']). 어디data_opp데이터를 저장하는 실제 키가 됩니다. 물론 이 키의 이름은 다른 파일 간에 변경할 수 있습니다.
  1. 마지막 단계 - 데이터 프레임 만들기:my_df = pd.DataFrame(data['data_opp'])

그게 다야 :)


<답변8>

또한MATLAB Engine for PythonMathWorks 자체에서. MATLAB이 있는 경우 고려해 볼 가치가 있습니다(직접 시도하지는 않았지만 MATLAB 파일을 읽는 것보다 훨씬 더 많은 기능이 있습니다). 그러나 다른 사용자에게 배포할 수 있는지 여부는 알 수 없습니다(그 사람들이 MATLAB을 가지고 있다면 문제가 되지 않을 것입니다. 그렇지 않으면 NumPy가 올바른 방법일까요?).

또한 모든 기본 사항을 직접 수행하려는 경우MathWorks provides(링크가 변경되면 Google에서matfile_format.pdf또는 그 제목MAT-FILE Format) 파일 형식의 구조에 대한 자세한 문서. 개인적으로 생각했던 것만큼 복잡하지는 않지만 분명히 가장 쉬운 방법은 아닙니다. 또한 기능의 수에 따라 다릅니다..mat-지원하려는 파일.

몇 가지 기본적인 내용을 읽을 수 있는 "작은"(약 700줄) Python 스크립트를 작성했습니다..mat-파일. 저는 Python 전문가도 아니고 초보자도 아니며 작성하는 데 약 2일이 걸렸습니다(위에 링크된 MathWorks 설명서 사용). 나는 많은 새로운 것을 배웠고 그것은 꽤 재미있었습니다 (대부분의 시간). 직장에서 Python 스크립트를 작성했기 때문에 게시할 수 없습니다... 하지만 여기에 몇 가지 조언을 드릴 수 있습니다.

  • 먼저 설명서를 읽으십시오.
  • 16진수 편집기(예:HxD) 참조를 살펴보십시오..mat-파싱하려는 파일.
  • 바이트를 .txt 파일에 저장하고 각 줄에 주석을 달아 각 바이트의 의미를 알아내십시오.
  • 클래스를 사용하여 각 데이터 요소(예:miCOMPRESSED,miMATRIX,mxDOUBLE, 또는miINT32)
  • 그만큼.mat-파일의 구조는 트리 데이터 구조에 데이터 요소를 저장하는 데 최적입니다. 각 노드에는 하나의 클래스와 하위 노드가 있습니다.

<답변9>

혼합 데이터 유형을 사용하여 mat 파일을 pandas dataFrame으로 읽으려면

import scipy.io as sio
mat=sio.loadmat('file.mat')# load mat-file
mdata = mat['myVar']  # variable in mat file 
ndata = {n: mdata[n][0,0] for n in mdata.dtype.names}
Columns = [n for n, v in ndata.items() if v.size == 1]
d=dict((c, ndata[c][0]) for c in Columns)
df=pd.DataFrame.from_dict(d)
display(df)

<답변10>

와는 별개로scipy.io.loadmatv4(레벨 1.0), v6, v7에서 7.2 matfile 및h5py.File7.3 형식 매트파일의 경우 다른 유형의 매트파일이 있습니다.텍스트 데이터 형식일반적으로 생성되는 바이너리 대신옥타브, 어느can't even be read in MATLAB.

둘다scipy.io.loadmat그리고h5py.File로드할 수 없으며(scipy 1.5.3 및 h5py 3.1.0에서 테스트) 내가 찾은 유일한 해결책은numpy.loadtxt.

import numpy as np
mat = np.loadtxt('xxx.mat')

<답변11>

hdf5storage 라이브러리를 사용할 수도 있습니다. 공식 문서herematlab 버전 지원에 대한 자세한 내용은

import hdf5storage

label_file = "./LabelTrain.mat"
out = hdf5storage.loadmat(label_file) 

print(type(out)) # 

<답변12>

  1. 사이피 설치

    pip install scipy

  2. scipy.io.loadmat 모듈 가져오기

     from scipy.io import loadmat
      annots = loadmat('annotation_0001.mat')
      print(annots)
  1. .mat 파일 구조 구문 분석
   con_list = [[element for element in upperElement] for upperElement in annots['obj_contour']]
  1. Pandas 데이터 프레임을 사용하여 데이터 작업
import pandas as pd
   newData = list(zip(con_list[0], con_list[1]))
   columns = ['obj_contour_x', 'obj_contour_y']
   df = pd.DataFrame(newData, columns=columns)

참조:https://www.askpython.com/python/examples/mat-files-in-python


<답변13>

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 파일을 읽을 수 있습니다.


<답변14>

스스로 이 문제와 씨름하고 다른 라이브러리를 시도한 후(mat4py도 좋지만 몇 가지 제한 사항이 있음) 이 라이브러리를 구축했습니다("matdata2py") 대부분의 변수 유형을 처리할 수 있으며 가장 중요한 것은 "문자열" 유형을 처리할 수 있습니다. .mat 파일은 -V7.3 버전으로 저장해야 합니다. 이것이 커뮤니티에 유용할 수 있기를 바랍니다.

pip install matdata2py
import matdata2py as mtp
Variables_output = mtp.loadmatfile(file_Name, StructsExportLikeMatlab = True, ExportVar2PyEnv = False)
print(Variables_output.keys()) # with ExportVar2PyEnv = False the variables are as elements of the Variables_output dictionary. 

ExportVar2PyEnv = True를 사용하면 각 변수를 Mat 파일에 저장된 것과 동일한 이름을 가진 Python 변수로 개별적으로 볼 수 있습니다.

StructsExportLikeMatlab = True/False 구조는 사전 형식(False) 또는 Matlab과 유사한 도트 기반 형식(True)으로 내보내집니다.

ExportVar2PyEnv = True/False 모든 변수를 단일 사전(True) 또는 별도의 개별 변수로 파이썬 환경으로 내보내기(False)


<답변15>

scipy는 .mat 파일을 로드하는 데 완벽하게 작동합니다. 그리고 get() 함수를 사용하여 numpy 배열로 변환할 수 있습니다.

mat = scipy.io.loadmat('point05m_matrix.mat')

x = mat.get("matrix")
print(type(x))
print(len(x))

plt.imshow(x, extent=[0,60,0,55], aspect='auto')
plt.show()

<답변16>

  1. Python에 mat4py를 설치합니다. 성공적으로 설치하면 다음과 같은 결과가 나타납니다.
  2. mat4py-0.5.0을 성공적으로 설치했습니다.
  3. mat4py에서 loadmat 가져오기.
  4. 변수 내에 파일 실제 위치를 저장합니다.
  5. Python을 사용하여 매트 파일 형식을 데이터 값으로 로드
    pip install mat4py
    from mat4py import loadmat
    boston = r"E:\Downloads\boston.mat"data = loadmat(boston, meta=False)
반응형