我也在 Mathwork 上发表了这篇文章。但我想我在这里问也会受益。 这是我的数学社区帖子的链接。 https://www.mathworks.com/matlabcentral/answers/2104821-load-save-python-list-of-list-with-matlab?s_tid=prof_contriblnk
基本上,我的问题是我的“.mat”数据中有一些单元格数组,它们就像地雷。我只有踩到它们时才知道。这些元胞数组使用“mat73”库加载 matfile 转换为 python 中的列表列表,但当我尝试使用 scipy 保存它们时无法转换回 matlab 元胞数组。
我想知道是否还有其他可能的Python库可以处理列表的保存列表。或者如果我可以保存 python 对象并使用一些 MATLAB 技巧将它们加载到 MATLAB。
我的数据看起来像这样:
dat = {'k1':{'k11':[1,2,3],'k12':[[1,2],[1],[2,2]]},'k2': [] ....}
问题是保存 dat['k1']['k12'] 因为 list 中的列表长度不同。但我不知道这个“k12”会在我的实际数据中弹出,而且它可能比这个示例嵌套得多。
欢迎任何意见。我可以尝试用 MATLAB 和 python 来解决。非常感谢!
我可以通过在 python 中将列表的列表填充到相同的长度来避免这种情况。我填充数据的方式来自这篇文章:填充列表列表以使其等于最大列表的大小。
当我创建列表列表并想将其保存到 matfile 时,我使用了该方法。 这仍然是可能的,但在当前问题上这样做非常烦人......(如果我想填充它,我必须搜索列表列表。
如果您的 Python 数据仅包含简单类型,如字典、列表、数值和字符串(如示例所示),那么您应该能够使用 JSON 将数据传递给 MATLAB。
例如,在Python中:
import json
dat = {'k1':{'k11':[1,2,3],'k12':[[1,2],[1],[2,2]]},'k2': []}
with open('dat.json', 'w') as f:
json.dump(dat, f)
然后在 MATLAB 中:
dat = jsondecode(fileread('dat.json'))
dat =
struct with fields:
k1: [1×1 struct]
k2: []
>> dat.k1
ans =
struct with fields:
k11: [3×1 double]
k12: {3×1 cell}
>> dat.k1.k12
ans =
3×1 cell array
{2×1 double}
{[ 1]}
{2×1 double}
要探索 MATLAB 结构体中的内容并以编程方式访问其内容,您可以使用
fieldnames
函数和 struct.(something)
表示法。