Scipy.io savemat / loadmat列表

时间:2018-04-28 11:09:32

标签: python python-3.x list numpy scipy

我尝试创建列表列表并将其添加到字典键中,然后将字典保存为.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 :(得分:1)

最可能的解释是,您的库不适用于列表列表,尤其是,其中子列表具有不同的长度。您应该检查是否确实如此。

根据docsscipy.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]))