2016-09-01 2 views
6
% save .mat file in the matlab  
train_set_x=1:50*1*51*61*23; 
train_set_x=reshape(train_set_x,[50,1,51,61,23]); 
save(['pythonTest.mat'],'train_set_x','-v7.3'); 

데이터는 (50,1,51,61,23)의 크기입니다.파이썬에서 .mat 파일을 읽습니다. 그러나 데이터의 모양이 변경되었습니다

link 명령으로 Python에서 .mat 파일을로드합니다. train_set_x.shape의

import numpy as np, h5py 
f = h5py.File('pythonTest.mat', 'r') 
train_set_x = f.get('train_set_x') 
train_set_x = np.array(train_set_x) 

출력은 (23L, 61L, 51L, 1L, 50L)이며 다음과 같이

코드이다. (50L, 1L, 51L, 61L, 23L)이 될 것으로 예상됩니다. 그래서

train_set_x=np.transpose(train_set_x, (4,3,2,1,0)) 

내가 파이썬과 MATLAB 사이의 데이터 형태의 변화에 ​​대한 호기심으로 모양을 변경했습니다. 내 코드에 오류가 있습니까?

+1

관련 : http://stackoverflow.com/q/24116713/1714410 – Shai

+0

이전의'.mat' 버전의 경우,'scipy.io.loadmat'는 MATLAB과 같은 모양이지만'order = 'F '' 배열을 만듭니다. 따라서 그것은 이러한 차이를 숨 깁니다. – hpaulj

+0

@ hpaulj : 일찌감치는 무엇을 의미합니까? "늦은"매트 버전의 동작 변경 사항은 무엇입니까? – Eric

답변

4

코드에 오류가 없습니다. Matlab과 Python은 다차원 배열을 처리하는 방식에 근본적인 차이점이 있습니다.
Matalb과 python은 다차원 배열의 모든 요소를 ​​하나의 연속 된 블록으로 메모리에 저장합니다. 즉, 2D, 배열의 크기에 따른 요소를 저장하고,
matlab에 (FORTRAN 등) 열 우선 방식의 요소를 저장 : 차이는 요소의 순서이다

[1 3; 
    2 4] 

[1 2; 
3 4]; 

그래서 블록 메모리 : 반대로

, 파이썬, 즉 어레이의 마지막 차원에서 시작하고, 행 우선 방식으로 저장 소자 Matlab에서 크기[m,n,k]은 파이썬에서 모양[k,n,m]의 배열로 표시됩니다.

자세한 내용은 this wiki page을 참조하십시오.

BTW, 대신 train_set_x을 전치, 당신이 "포트란"순서 (COL-주요 matlab에 같이) 순서를 설정하려고 할 수 있습니다

train_set_x = np.array(train_set_x, order='F') 
+0

'order = 'F''를 설정할 때 결과가 트랜스 포즈와 다른가요? 또는 메모리 사용량 만 차이가 있습니까? – Ian

+0

은 numpy 변환에서 O (1) 연산입니다. 메모리의 요소를 다시 배치하지 않고 배열의 메타 데이터 만 정지시킵니다 (해당 [strides'] (http://docs.scipy.org/ doc/numpy/reference/generated/numpy.ndarray.strides.html)). 나는'strides'와'shape'을'order = "F"'와 함께 읽은 다음 양도 할 수 있다고 가정합니다. 나는이 두 가지 방법이 같은 목적에 달하는 것 같아요. – Shai

+0

감사! 이항 (transposing)이 동일한 결과를 산출하는 경우에도 'order'인수에 대해 알아 두는 것이 좋습니다. – Ian

관련 문제