2012-08-14 15 views
7

que tienen un archivo estera que accede utilizando¿Cómo preservar la estructura de matlab cuando se accede en python?

from scipy import io 
mat = io.loadmat('example.mat') 

desde MATLAB, example.mat contiene la siguiente estructura

>> load example.mat 
    >> data1 

    data1 = 

      LAT: [53x1 double] 
      LON: [53x1 double] 
      TIME: [53x1 double] 
      units: {3x1 cell} 


    >> data2 

    data2 = 

      LAT: [100x1 double] 
      LON: [100x1 double] 
      TIME: [100x1 double] 
      units: {3x1 cell} 

en Matlab, puedo acceder a los datos tan fácil como data2.LON, etc. No es tan trivial en Python. Me da varias opciones aunque como

mat.clear  mat.get   mat.iteritems mat.keys  mat.setdefault mat.viewitems 
mat.copy  mat.has_key  mat.iterkeys mat.pop   mat.update  mat.viewkeys  
mat.fromkeys mat.items  mat.itervalues mat.popitem  mat.values  mat.viewvalues  

¿Es posible conservar la misma estructura en python? Si no, ¿cómo acceder mejor a los datos? El código Python actual que estoy usando es muy difícil de usar.

Gracias

+0

¿Puede explicar cómo se ve cuando lo carga en python? –

+0

También, otro pensamiento. Si está usando SciPi, ¿ha intentado usar 'SciPi.loadmat'? –

+0

sí, probé loadmat. La salida en python es simplemente difícil de usar. Ni siquiera sé cómo acceder a LON o LAT en data1 o data2. – mikeP

Respuesta

6

Encontramos este tutorial sobre la estructura de MATLAB y Python

http://docs.scipy.org/doc/scipy/reference/tutorial/io.html

+0

Esto también podría agregarle una capa de información adicional: http://stackoverflow.com/questions/1984714/how-to-access-fields-in-a-struct-imported-from-a-mat -file-using-loadmat-in-pyth? rq = 1 –

0

(!) En el caso de estructuras anidadas guardados en *.mat archivos, es necesario comprobar si los elementos de la diccionario que io.loadmat salidas son estructuras de Matlab. Por ejemplo, si en Matlab

>> thisStruct 

ans = 
     var1: [1x1 struct] 
     var2: 3.5 

>> thisStruct.var1 

ans = 
     subvar1: [1x100 double] 
     subvar2: [32x233 double] 

continuación, utilizar el código por Mergen en scipy.io.loadmat nested structures (i.e. dictionaries)

0

Cuando necesito para cargar datos en Python de MATLAB que se almacena en una matriz de estructuras {strut_1, struct_2} I extraer una lista de claves y valores del objeto que cargo con scipy.io.loadmat. Luego puedo ensamblarlas en sus propias variables, o si es necesario, empacarlas en un diccionario. El uso del comando exec puede no ser apropiado en todos los casos, pero si solo está tratando de procesar datos, funciona bien.

# Load the data into Python  
D= sio.loadmat('data.mat') 

# build a list of keys and values for each entry in the structure 
vals = D['results'][0,0] #<-- set the array you want to access. 
keys = D['results'][0,0].dtype.descr 

# Assemble the keys and values into variables with the same name as that used in MATLAB 
for i in range(len(keys)): 
    key = keys[i][0] 
    val = np.squeeze(vals[key][0][0]) # squeeze is used to covert matlat (1,n) arrays into numpy (1,) arrays. 
    exec(key + '=val') 
Cuestiones relacionadas