2011-01-27 13 views
6

Soy un usuario de Matlab nuevo en Python. Me gustaría escribir una matriz de celdas de cadenas en Matlab en un archivo Mat, y cargar este archivo Mat usando Python (tal vez scipy.io.loadmat) en algún tipo similar (por ejemplo, lista de cadenas o tuplas de cadenas). Pero loadmat lee cosas en array y no estoy seguro de cómo convertirlo en una lista. Probé la función "tolist" que no funciona como esperaba (tengo una comprensión pobre de la matriz Python o la matriz numpy). Por ejemplo: CódigoCómo cargar una matriz de celdas de cadenas en archivos Mat Mat en la lista o tupla de Python usando Scipy.io.loadmat

Matlab: Código

cell_of_strings = {'thank', 'you', 'very', 'much'}; 
save('my.mat', 'cell_of_strings'); 

Python:

matdata=loadmat('my.mat', chars_as_strings=1, matlab_compatible=1); 
array_of_strings = matdata['cell_of_strings'] 

Entonces, los array_of_strings variables es:

array([[[[u't' u'h' u'a' u'n' u'k']], [[u'y' u'o' u'u']], 
    [[u'v' u'e' u'r' u'y']], [[u'm' u'u' u'c' u'h']]]], dtype=object) 

No estoy seguro de cómo convertir esta array_of_strings en una lista o tupla de Python para que se vea como

list_of_strings = ['thank', 'you', 'very', 'much']; 

No estoy familiarizado con el objeto de matriz en Python o numpy. Tu ayuda será altamente apreciada.

Respuesta

4

Que su probado esto:

import scipy.io as si 

a = si.loadmat('my.mat') 
b = a['cell_of_strings']    # type(b) <type 'numpy.ndarray'> 
list_of_strings = b.tolist()   # type(list_of_strings) <type 'list'> 

print list_of_strings 
# output: [u'thank', u'you', u'very', u'much'] 
+2

b.tolist() da [[matriz ([[u't ', u'h', u'a ', u'n', u'k ']], dtype =' Causality

+0

@Denzel. ¿Debe usar chars_as_strings = 1, matlab_compatible = 1? – Marcin

2

Esto se parece a un trabajo para list comprehension. Repitiendo el ejemplo, hice esto en MATLAB:

cell_of_strings = {'thank', 'you', 'very', 'much'}; 
save('my.mat', 'cell_of_strings','-v7'); 

estoy usando una nueva versión de MATLAB, lo que ahorra .mat archivos en formato HDF5 por defecto. loadmat no se pueden leer archivos HDF5, por lo que el indicador '-v7' obligará a MATLAB a guardar en un archivo de versión anterior .mat, que loadmat puede entender.

En Python, cargué la serie de células igual que lo hizo:

import scipy.io as sio 
matdata = sio.loadmat('%s/my.mat' %path, chars_as_strings=1, matlab_compatible=1); 
array_of_strings = matdata['cell_of_strings'] 

impresión array_of_strings da:

[[array([[u't', u'h', u'a', u'n', u'k']], 
      dtype='<U1') 
     array([[u'y', u'o', u'u']], 
      dtype='<U1') 
     array([[u'v', u'e', u'r', u'y']], 
      dtype='<U1') 
     array([[u'm', u'u', u'c', u'h']], 
      dtype='<U1')]] 

La variable array_of_strings es un (1,4) tabla de objeto numpy pero hay son matrices anidadas dentro de cada objeto. Por ejemplo, el primer elemento de array_of_strings es una matriz (1,5) que contiene las letras para 'gracias'. Es decir,

array_of_strings[0,0] 
array([[u't', u'h', u'a', u'n', u'k']], 
     dtype='<U1') 

para llegar a la primera letra 't', lo que tiene que hacer algo como:

array_of_strings[0,0][0,0] 
u't' 

Dado que se trata de matrices anidadas, tenemos que emplear alguna técnica recursiva para extraer los datos, es decir, anidados for bucles. Pero primero, le mostraré cómo extraer la primera palabra:

first_word = [str(''.join(letter)) for letter in array_of_strings[0][0]] 
first_word 
['thank'] 

Aquí estoy usando una lista de comprensión. Básicamente, estoy recorriendo cada letra en array_of_strings [0] [0] y concatenándolas usando el método ''.join. La función string() es convertir las cadenas Unicode en cadenas normales.

Ahora, para obtener las cadenas de la lista que desea, sólo tenemos que recorrer cada serie de cartas:

words = [str(''.join(letter)) for letter_array in array_of_strings[0] for letter in letter_array] 
words 
['thank', 'you', 'very', 'much'] 

listas por comprensión tomar algún tiempo para acostumbrarse, pero son de gran utilidad. Espero que esto ayude.

+0

words = [str (''. Join (carta)) para letter_array en array_of_strings [0] para letter en letter_array] debe ser words = [str (''. Join (letter)) para letter_array en array_of_strings para letter en letter_array] –

Cuestiones relacionadas