2011-01-27 4 views
6

Jestem użytkownikiem Matlab nowym w języku Python. Chciałbym napisać tablicę ciągów znaków w Matlab do pliku Mat i załadować ten plik Mat używając Pythona (może scipy.io.loadmat) do jakiegoś podobnego typu (np. Lista ciągów lub krotek napisów). Ale loadmat odczytuje rzeczy do tablicy i nie jestem pewien, jak przekonwertować go na listę. Próbowałem funkcji "tolist", która nie działa zgodnie z oczekiwaniami (mam słabe zrozumienie tablicy Pythona lub tablicy numpy). Na przykład: KodJak załadować tablicę komórek ciągów w plikach Matlab Mat na listę lub krotkę w języku Python za pomocą Scipy.io.loadmat

Matlab: Kod

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'] 

Następnie, zmienna array_of_strings jest:

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) 

Nie jestem pewien, jak konwertować to array_of_strings do listy lub krotki w języku Python, aby wyglądała jak

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

Nie jestem zaznajomiony z obiektem tablicy w Pythonie lub numpy. Twoja pomoc będzie bardzo ceniona.

Odpowiedz

4

Wyraź swoją próbował to:

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() daje [[array ([[u't ', u'h', u'a ', u'n', u'k ']], dtype =' Causality

+0

@Denzel. Czy musisz używać chars_as_strings = 1, matlab_compatible = 1? – Marcin

2

To wygląda na zadanie dla list comprehension. Powtarzając swój przykład, zrobiłem to w MATLAB:

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

Używam nowszą wersję MATLAB, co oszczędza .mat pliki w formacie HDF5 domyślnie. loadmat nie może odczytać plików HDF5, więc flaga "-v7" wymusza na MATLAB zapisanie do starszej wersji pliku .mat, który może zrozumieć loadmat.

W Pythonie, załadowałem tablicę komórek właśnie jak ty:

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'] 

Druk array_of_strings daje:

[[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')]] 

Zmienna array_of_strings jest (1,4) numpy obiekt array ale tam są tablice zagnieżdżone w każdym obiekcie. Na przykład pierwszy element array_of_strings jest tablicą (1,5) zawierającą litery "dziękuję". Oznacza to, że

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

Aby dostać się na pierwszej literze „t”, trzeba zrobić coś takiego:

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

Ponieważ mamy do czynienia z zagnieżdżonych tablic, musimy zatrudnić jakąś rekurencyjną technikę wyodrębnij dane, tj. zagnieżdżone pętle for. Ale najpierw pokażę ci, jak wyodrębnić pierwsze słowo:

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

Tutaj używam zrozumienia list. Zasadniczo przepuszczam przez każdą literę w array_of_strings [0] [0] i łączę je za pomocą metody ''.join. Funkcja string() służy do zamiany łańcuchów unicode na zwykłe ciągi.

Teraz, aby uzyskać listę ciągów chcesz, po prostu trzeba pętli każdej tablicy liter:

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

Ułatwienia Lista trochę przyzwyczaić, ale są one bardzo przydatne. Mam nadzieję że to pomoże.

+0

words = [str (''. Join (letter)) dla letter_array w array_of_strings [0] dla litery w letter_array] powinno być words = [str (''. Join (letter)) dla letter_array w array_of_strings dla letter w letter_array] –