2015-12-08 8 views
7

मैं वर्तमान में एक प्रोजेक्ट पर काम कर रहा हूं जहां मुझे विरासत मैटलैब कोड (मैटलैब इंजन का उपयोग करके) और शेष पायथन (numpy) में प्रसंस्करण के कुछ चरणों की आवश्यकता है।मैटलैब इंजन सरणी को numpy ndarray में कुशलता से परिवर्तित करने के लिए कैसे?

मैंने देखा है कि numpy के numpy.ndarray को मैटलैब का matlab.mlarray.double से परिणाम परिवर्तित बुरी तरह धीमी गति से लगता है। निम्नलिखित समय

import timeit 
setup_range = ("import numpy as np\n" 
       "x = range(1000)") 
setup_arange = ("import numpy as np\n" 
       "x = np.arange(1000)") 
setup_matlab = ("import numpy as np\n" 
       "import matlab.engine\n" 
       "eng = matlab.engine.start_matlab()\n" 
       "x = eng.linspace(0., 1000.-1., 1000.)") 
print 'From other array' 
print timeit.timeit('np.array(x)', setup=setup_arange, number=1000) 
print 'From list' 
print timeit.timeit('np.array(x)', setup=setup_range, number=1000) 
print 'From matlab' 
print timeit.timeit('np.array(x)', setup=setup_matlab, number=1000) 

कौन लेता है::

From other array 
0.00150722111994 
From list 
0.0705359556928 
From matlab 
7.0873282467 

रूपांतरण के बारे में लेता है

यहाँ एक और ndarray, एक सूची और एक mlarray से 1000 तत्वों के साथ एक ndarray बनाने के लिए कुछ उदाहरण कोड है सूची से रूपांतरण के रूप में 100 गुना।

क्या रूपांतरण को गति देने का कोई तरीका है?

उत्तर

9

प्रश्न पोस्ट करने के बाद क्षण मुझे समाधान मिला।

एक आयामी सरणी के लिए, मैटलैब सरणी के केवल _data संपत्ति का उपयोग।

import timeit 
print 'From list' 
print timeit.timeit('np.array(x)', setup=setup_range, number=1000) 
print 'From matlab' 
print timeit.timeit('np.array(x)', setup=setup_matlab, number=1000) 
print 'From matlab_data' 
print timeit.timeit('np.array(x._data)', setup=setup_matlab, number=1000) 

प्रिंट

From list 
0.0719847538787 
From matlab 
7.12802865169 
From matlab_data 
0.118476275533 

बहुआयामी सरणियों के लिए आप बाद में सरणी नयी आकृति प्रदान करने की जरूरत है। दो आयामी सरणी के मामले में इसका मतलब है

np.array(x._data).reshape(x.size[::-1]).T 
6

टिम जवाब 2 डी सरणियों के लिए महान है, लेकिन एन आयामी सरणी के लिए यह अनुकूल करने के लिए एक तरह से np.reshape() की order पैरामीटर का उपयोग करने के लिए है बुला:

np_x = np.array(x._data).reshape(x.size, order='F')

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