我正在尝试创建一个列表列表并将其添加到字典键,然后将字典另存为.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
文件中?
最可能的解释是您的库不能很好地处理列表列表,尤其是在子列表具有不同长度的情况下。您应该检查是否确实如此。
根据docs,scipy.io.savemat
是为数组字典而设计的,这不是您提供的:
将名称和数组的字典保存到 MATLAB 样式的 .mat 文件中。
这会将给定字典中的数组对象保存到 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 中没有原生函数组合,但使用 3rd 方库可以使上述逻辑更具可读性toolz
:
from operator import itemgetter
from toolz import compose
res = list(map(compose(list, itemgetter(0), list), lst[0]))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句