我尝试创建列表列表并将其添加到字典键中,然后将字典保存为.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
文件中?
答案 0 :(得分:1)
最可能的解释是,您的库不适用于列表列表,尤其是,其中子列表具有不同的长度。您应该检查是否确实如此。
根据docs,scipy.io.savemat
是为数组字典设计的,而不是您提供的字典:
将名称和数组的字典保存到MATLAB样式的.mat文件中。
这将给定字典中的数组对象保存到MATLAB- style .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]))