<질문>
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.loadmat
MATLAB 배열 버전 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 파일에서 데이터 불러오기
함수loadmat
Python의 데이터만 사용하여 MAT 파일에 저장된 모든 변수를 간단한 Python 데이터 구조로 로드합니다.dict
그리고list
사물. 숫자형 및 셀형 배열은 행 순서의 중첩 목록으로 변환됩니다. 요소가 하나만 있는 배열을 제거하기 위해 배열을 압착합니다. 결과 데이터 구조는 다음과 호환되는 단순 유형으로 구성됩니다.JSON체재.
예: MAT 파일을 Python 데이터 구조로 로드합니다.
from mat4py import loadmat
data = loadmat('datafile.mat')
변수data
이다dict
MAT 파일에 포함된 변수와 값을 사용합니다.
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
.
다음과 같이 하십시오.
패키지 설치:
pip install pymatreader
이 패키지의 관련 기능 가져오기:
from pymatreader import read_mat
다음 함수를 사용하여 matlab 구조체를 읽습니다.
data = read_mat('matlab_struct.mat')
data.keys()
사용하여 데이터가 실제로 저장된 위치를 찾습니다.
- 키는 일반적으로 다음과 같습니다.
dict_keys(['__header__', '__version__', '__globals__', 'data_opp'])
. 어디data_opp
데이터를 저장하는 실제 키가 됩니다. 물론 이 키의 이름은 다른 파일 간에 변경할 수 있습니다.
- 마지막 단계 - 데이터 프레임 만들기:
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.loadmat
v4(레벨 1.0), v6, v7에서 7.2 matfile 및h5py.File
7.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>
사이피 설치
pip install scipy
scipy.io.loadmat 모듈 가져오기
from scipy.io import loadmat
annots = loadmat('annotation_0001.mat')
print(annots)
- .mat 파일 구조 구문 분석
con_list = [[element for element in upperElement] for upperElement in annots['obj_contour']]
- 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>
- Python에 mat4py를 설치합니다. 성공적으로 설치하면 다음과 같은 결과가 나타납니다.
- mat4py-0.5.0을 성공적으로 설치했습니다.
- mat4py에서 loadmat 가져오기.
- 변수 내에 파일 실제 위치를 저장합니다.
- Python을 사용하여 매트 파일 형식을 데이터 값으로 로드
pip install mat4py
from mat4py import loadmat
boston = r"E:\Downloads\boston.mat"
data = loadmat(boston, meta=False)
'개발 > Python' 카테고리의 다른 글
[파이썬] 1D 배열의 실행 평균을 계산하는 SciPy 함수 또는 NumPy 함수? (0) | 2023.08.12 |
---|---|
[파이썬] 기존 csv 파일에 pandas 데이터를 추가하는 방법 (0) | 2023.08.12 |
[파이썬] datetime 간의 시차를 구하는 방법 (0) | 2023.08.11 |
[파이썬] 키를 누를때까지 기다리는 방법 (0) | 2023.08.11 |