Как я могу создать структурный массив Matlab из scipy.io?
Рассмотрим следующий код Matlab:
pmod(1).name{1} = 'regressor1';
pmod(1).param{1} = [1 2 4 5 6];
pmod(1).poly{1} = 1;
pmod(2).name{1} = 'regressor2-1';
pmod(2).param{1} = [1 3 5 7];
pmod(2).poly{1} = 1;
Это создает массив массива. Каждая структура в массиве содержит три поля типа cell
, Таким образом, мы имеем следующую иерархию в pmod
:
pmod // struct array
|
*- struct
| |
| *- cell // contains 1 or more strings
| *- cell // contains 1 or more arrays
| *- cell // contains 1 or more arrays
|
*- struct [...]
Я пытаюсь использовать scipy.io
создать приведенные выше структуры данных в Python, чтобы они могли быть загружены в Matlab (эта иерархия требуется для SPM).
Создание структуры очень просто, так как scipy.io.savemat
сохраняет любой дикт, чьи ключи все типа str
как структура Matlab:
from scipy.io import savemat
struct = {
'field1': 1,
'field2': 2,
}
savemat('/tmp/p.mat', {'a_struct': struct})
Однако, пытаясь обобщить это для массива структуры, я столкнулся со следующим препятствием:
struct_array = [struct, struct]
savemat('/tmp/p.mat', {'s_array': struct_array})
Это не ведет себя как ожидалось; при загрузке p.mat
в Matlab я получаю массив ячеек 1x2, а не массив структур.
Как я могу создать массив массива, используя scipy.io
?
Заметки:
- я пытался
savemat('/tmp/p.mat', np.array(struct_array))
а такжеsavemat('/tmp/p.mat', np.array(struct_array, dtype=object))
, но безрезультатно.
1 ответ
Ты можешь использовать np.core.records.fromarrays
создать массив записей, который примерно эквивалентен структуре MATLAB, и будет преобразован в структуру MATLAB с помощью scip.io.savemat
,
from numpy.core.records import fromarrays
from scipy.io import savemat
myrec = fromarrays([[1, 10], [2, 20]], names=['field1', 'field2'])
savemat('p.mat', {'myrec': myrec})
При открытии в MATLAB это дает:
>> load('p.mat')
>> myrec
myrec =
1x2 struct array with fields:
field1
field2