Как я могу создать структурный массив 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?

Заметки:

  1. я пытался 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
Другие вопросы по тегам