2015-12-08 14 views
7

Attualmente sto lavorando su un progetto in cui ho bisogno di fare alcune fasi di elaborazione con codice Matlab legacy (usando il motore Matlab) e il resto in Python (numpy).Come convertire in modo efficiente gli array di motori Matlab in numpy ndarray?

Ho notato che la conversione dei risultati da Matlab matlab.mlarray.double a numpy numpy.ndarray sembra terribilmente lenta.

Ecco qualche esempio di codice per creare un ndarray con 1000 elementi da un altro ndarray, una lista e un mlarray:

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) 

Quale prende i seguenti orari:

From other array 
0.00150722111994 
From list 
0.0705359556928 
From matlab 
7.0873282467 

La conversione dura circa 100 volte più lungo di una conversione dalla lista.

C'è un modo per accelerare la conversione?

risposta

9

Momenti dopo aver postato la domanda ho trovato la soluzione.

Per gli array monodimensionali, accedere solo alla proprietà _data dell'array Matlab.

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) 

stampe

From list 
0.0719847538787 
From matlab 
7.12802865169 
From matlab_data 
0.118476275533 

Per array multidimensionali è necessario rimodellare la matrice in seguito. Nel caso di matrici bidimensionali questo significa chiamare

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

risposta di Tim è grande per le matrici 2D, ma un modo per adattarlo a N matrici dimensionali è utilizzare il parametro order di np.reshape():

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