Scipy.io savemat / loadmat со списком списков - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь создать список списков и добавить его в ключ словаря, а затем сохранить словарь в виде .mat файла. Мой код выглядит так:

from scipy.io import loadmat
dic = {"X": [[1,2,3],[1,2,4],[6,7,8,9],[1]]}
savemat('Test.mat', mdict=dic)

Когда я загружаю .mat файл с loadmat и печатаю dic['X']; вывод должен быть [[1,2,3],[1,2,4],[6,7,8,9],[1]]. Вместо этого я получаю это:

[[array([[1, 2, 3]]) array([[1, 2, 4]]) array([[6, 7, 8, 9]]) array([[1]])]]

Мой фрагмент кода для загрузки и восстановления dic:

X = loadmat("Test.mat")
print(X['X'])

Как сохранить исходный список в .mat файле?

1 Ответ

0 голосов
/ 28 апреля 2018

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

Согласно документам , scipy.io.savemat предназначен для словаря массивов, который вы не предоставили:

Сохранение словаря имен и массивов в файл .mat в стиле MATLAB.

Это сохраняет объекты массива в данном словаре в MATLAB- стиль .mat файл.

Что вы можете сделать, это реструктурировать ваши данные:

dic = {"A": np.array([1, 2, 3]),
       "B": np.array([1, 2, 4]),
       "C": np.array([6, 7, 8, 9]),
       "D": np.array([1])}

Помните, что массив numpy со строками разной длины станет dtype=Object и станет практически непригодным для большинства векторизованных функций. С scipy это, вероятно, тоже не будет работать.


Тяжелое решение - выполнить преобразование при повторной загрузке данных:

import numpy as np
from operator import itemgetter

lst = [[np.array([[1, 2, 3]]), np.array([[1, 2, 4]]),
        np.array([[6, 7, 8, 9]]), np.array([[1]])]]

res = list(map(list, (map(itemgetter(0), map(list, lst[0])))))

[[1, 2, 3], [1, 2, 4], [6, 7, 8, 9], [1]]

В Python нет нативной композиции функций, но приведенную выше логику можно сделать более читабельной с помощью сторонней библиотеки toolz:

from operator import itemgetter
from toolz import compose

res = list(map(compose(list, itemgetter(0), list), lst[0]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...