2016-09-01 20 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 के निर्देश के साथ पायथन में .mat फ़ाइल लोड करता हूं।

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) 

train_set_x.shape के उत्पादन (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' मैटल के समान आकार के साथ सरणी उत्पन्न करता है, लेकिन 'ऑर्डर =' F''। इस प्रकार यह इस अंतर को छुपाता है। – hpaulj

+0

@ hpaulj: जल्दी से आपका क्या मतलब है? "देर से" मैट संस्करणों के लिए व्यवहार परिवर्तन क्या है? – Eric

उत्तर

4

आपके पास कोड में कोई त्रुटि नहीं है। मल्टीबैन्डल सरणी के इलाज के तरीके में मैटलैब और पायथन के बीच एक मौलिक अंतर है।
दोनों माटलब और पायथन मल्टी-मंद सरणी के सभी तत्व स्मृति में एक संगत ब्लॉक के रूप में स्टोर करते हैं। ,
मैटलैब, (fortran) की तरह एक कॉलम-पहले फैशन में तत्वों को संग्रहीत करता है कि सरणी के आयाम के अनुसार तत्वों भंडारण है, 2 डी के लिए: अंतर तत्वों का क्रम है

[1 3; 
    2 4] 

इसके विपरीत, अजगर, एक पंक्ति-पहले फैशन में तत्वों को संग्रहीत करता है कि पिछले सरणी के आयाम से शुरू कर रहा है: स्मृति में

[1 2; 
3 4]; 

तो एक ब्लॉक आकार[m,n,k] मैटलैब में आकार[k,n,m] की एक सरणी के रूप में पाइथन द्वारा देखा जाता है।

अधिक जानकारी के लिए this wiki page देखें।

Btw, बजाय train_set_x transposing की है, तो आप करने के लिए "फोरट्रान" आदेश (कॉल-प्रमुख के रूप में Matlab में) अपने आदेश सेट करने का प्रयास हो सकता है:

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

क्या आप 'ऑर्डर =' एफ 'सेट करते समय परिणाम ट्रांसपोज़िंग से भिन्न होते हैं? या यह केवल स्मृति उपयोग में एक अंतर बनाता है? – Ian

+0

'numpy' transposing में एक ओ (1) ऑपरेशन है: यह स्मृति में तत्वों को फिर से नहीं ढूंढता है, केवल सरणी के मेटा डेटा को लटकता है (इसकी ['strides'] (http://docs.scipy.org/ डॉक/numpy/संदर्भ/उत्पन्न/numpy.ndarray.strides.html))। मुझे लगता है कि आप 'ऑर्डर =' एफ '' और ट्रांसपोजिंग के साथ पढ़ने के बीच 'strides' और 'shape' की तुलना कर सकते हैं। मुझे लगता है कि इन दो विधियों को एक ही वस्तु के बराबर है। – Shai

+0

धन्यवाद! 'ऑर्डर' तर्क के बारे में जानना अच्छा होता है, भले ही उपज का परिणाम उसी परिणाम को पार कर जाए। – Ian

संबंधित मुद्दे