2011-01-27 2 views
6

Я являюсь пользователем Matlab, новым для Python. Я хотел бы написать массив ячеек строк в Matlab в файл Mat и загрузить этот файл Mat с помощью Python (возможно, scipy.io.loadmat) в некоторый подобный тип (например, список строк или кортежей строк). Но loadmat читает вещи в массиве, и я не уверен, как преобразовать его в список. Я попробовал функцию «списка», которая не работает, как я ожидал (у меня плохое представление о массиве Python или массиве numpy). Например:Как загрузить массив ячеек строк в файлах Matlab mat в список или кортеж Python с помощью Scipy.io.loadmat

Matlab код:

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

Затем переменная array_of_strings является:

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) 

Я не уверен, как преобразовать этот array_of_strings в список Python или кортеж, чтобы он выглядел как

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

Я не знаком с объектом массива в Python или numpy. Ваша помощь будет высоко оценена.

ответ

4

ли ваш попытался это:

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() дает [[массив [[u't ', u'h', u'a ', u'n', u'k ']], dtype =' Causality

+0

@ Denzel. Вы должны использовать chars_as_strings = 1, matlab_compatible = 1? – Marcin

2

Это похоже на работу для list comprehension. Повторяя свой пример, я сделал это в MATLAB:

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

Я использую новую версию MATLAB, что позволяет экономить .mat файлы в формате HDF5 по умолчанию. loadmat не может читать файлы HDF5, поэтому флаг «-v7» должен заставить MATLAB сохранить файл более старой версии .mat, который может понять loadmat.

В Python, я загрузил массив ячеек так же, как вы делали:

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

Печать array_of_strings дает:

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

Переменная array_of_strings является (1,4) NumPy массив объектов, но - массивы, вложенные в каждый объект. Например, первый элемент array_of_strings представляет собой массив (1,5), содержащий буквы для «благодарности». То есть,

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

Чтобы получить на первую букву «т», вы должны сделать что-то вроде:

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

Поскольку мы имеем дело с вложенными массивами, мы должны использовать некоторые рекурсивный метод для извлеките данные, т. е. вложенные петли for. Но сначала я покажу вам, как извлечь первое слово:

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

Здесь я использую понимание списка. В принципе, я перебираю каждую букву в array_of_strings [0] [0] и объединяю их с помощью метода ''.join. Функция string() состоит в том, чтобы преобразовать строки юникода в обычные строки.

Теперь, чтобы получить список строки, которые вы хотите, нам просто нужно Перебери каждый массив букв:

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

описаний списков займут некоторое время, чтобы привыкнуть, но они чрезвычайно полезны. Надеюсь это поможет.

+0

words = [str (''. Join (letter)) для letter_array в array_of_strings [0] для буквы в letter_array] должно быть словами = [str (''. Join (letter)) для letter_array в array_of_strings для буквы в letter_array] –