Matlab to Python: получить значения массива ячеек Matlab
Я очень новичок в Matlab и Python и мне нужно использовать некоторые значения в Python из массива ячеек Matlab.
У меня есть массив ячеек целых чисел, которые после того, как я выполню эту строку кода и напечатаю результат, я получаю это:
a = loadmat('file.mat')
print a
{'__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Sep 21 15:30:15 2011', 'juncForward_c': array([[ [[ [[ ([[30]], **[[91], [87]]**, [[3]], [[2.2455372690184494, 3.6052402625905993, 5.5884470309828833]], [[14.0, 4.0, 15.4]], [[-1, -1, 2]], [[91, 89, 93], [88, 85, 86]], [[500, 500, 5]], [[1, 2, 3]], [[11.133333333333333]], **[[4]]**, [[1]], [[1]], [[1.0], [20.365168528421695]])]]
[[ ([[30]], **[[99], [80]]**, [[3]], [[4.0376480381611373, 2.3561944901923448, 6.0857897473297058]], [[10.0, 15.4, 16.600000000000001]], [[-1, 1, 3]], [[98, 98, 100], [79, 81, 80]], [[500, 6, 33]], [[1, 2, 3]], **[[14]]**, [[2]], [[1]], [[1]], [[2.0], [6.6573267908372973]])]]
и распечатка продолжается.
Может ли кто-нибудь объяснить мне, как устроен массив ячеек? (так сколько размеров выше?)
Затем у меня есть несколько вопросов: 1) В этом массиве ячеек есть переменные "метка" и "координаты", которые назначены одному массиву / ячейке (я не знаю, какой фактический термин использовать) - значения выделены жирным шрифтом., Я хотел бы написать на Python для доступа к этим значениям. Как я должен идти об этом?
2) Чтобы проверить, я попробовал это -> juncInfoF = a.get('juncForward_c')
и когда я пытаюсь напечатать juncInfoF, он печатает "Нет". Почему это так? Я озадачен, потому что ранее, когда я попробовал это, это работает. Я мог бы даже сделать это -> print juncInfo[0][9][0][0]
, но сейчас я не могу даже сделать ничего из вышеперечисленного.
2 ответа
Я представляю себе loadmat('file.mat')
возвращает экземпляр класса shelve, который унаследован от класса dict. Я предполагаю, что вы используете функцию loadmat из scipy.io?
from scipy.io import loadmat
Документ Scipy только упоминает loadmat() возвращает словарь, но я предполагаю, что возвращаемый объект a
в вашем примере это открытый полочный файл, и вы больше не можете получить доступ к его содержимому, когда a
является closed
что может произойти по нескольким причинам, кроме звонка a.close()
ручная ее закрытие.
Чтобы предотвратить это, сначала скопируйте все данные в настоящий словарь, загружая эти данные:
mat_dict = {}
mat_dict.update(loadmat('file.mat'))
Теперь вы можете получить все ключи и значения из mat_dict
:
a = mat_dict['juncForward_c']
print(a.shape) # should work now
обратите внимание, что это правильное решение, если вы тестируете и выясняете, что представляют собой данные mat_dict. В вашем скрипте / модели / функции вы обычно загружаете только ту часть полки, которая вам нужна, а затем явно закрываете файл:
f = loadmat('file.mat')
a = f['juncForward_c']
f.close()
Я не знаю, работает ли оператор with (shelve пока не поддерживает его), вам придется его протестировать, но он должен обрабатывать закрытие, даже если во время загрузки выдается исключение a
:
with loadmat('file.mat') as f:
a = f['juncForward_c']
edit: подкласс из массива numpy для добавления дополнительных атрибутов
import numpy as np
class MatArray(np.array):
def __init__(self, filepath):
f = loadmat(filepath)
np.array.__init__(self, f['juncForward_c'])
self.version = f['__version__']
self.header = f['__header__']
f.close()
так что теперь, если вы хотите, чтобы ваш массив напоминал структуру matlab, вы делаете:
>>> a = MatArray('myfile.mat')
>>> a.header
'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Sep 21 15:30:15 2011'
>>> a.shape
так далее
Если в вашем файле mat есть только массивы ячеек со списком целых чисел или строк, я написал для этого общий код. Например, в Matlab вы можете сделать что-то вроде этого:
names = cell(1, N);
indices = cell(1, N);
for ind=1:N
names{ind} = *some_value*;
indices{ind} = *some_array*;
save('names_and_indices.mat', 'names', 'indices');
Здесь вы можете найти, как прочитать этот файл в Python.