如何通过遍历字段名将Matlab结构体转为Python列表?
从Matlab结构体循环创建Python列表的正确写法
假设你是用scipy.io.loadmat加载的Matlab数据,以下是两种常见场景的正确实现方式:
场景1:加载后的结构体是字典类型
scipy加载Matlab标量结构体时,通常需要通过[0, 0]索引取出实际的字典对象:
from scipy.io import loadmat # 加载Matlab文件 mat_data = loadmat('你的文件.mat') # 取出结构体(注意[0,0]是scipy加载标量结构体的常规操作) struct_data = mat_data['你的结构体名称'][0, 0]
直接生成v1到v17的字段名并遍历提取:
# 生成v1到v17的字段名字符串列表 field_names = [f'v{i}' for i in range(1, 18)] # 循环提取数组并构建列表 result_list = [] for field in field_names: result_list.append(struct_data[field]) # 或者用更简洁的列表推导式 result_list = [struct_data[f'v{i}'] for i in range(1, 18)]
场景2:加载后的结构体是numpy结构化数组
如果结构体是numpy结构化数组类型,可以先获取所有字段名,再筛选出目标字段:
# 获取结构体所有字段名,筛选出v1到v17 field_names = [name for name in struct_data.dtype.names if name.startswith('v') and 1 <= int(name[1:]) <= 17] # 遍历提取构建列表 result_list = [struct_data[name] for name in field_names]
注意事项
- 先通过
type(struct_data)确认加载后结构体的类型,再选择对应写法 - 确保Matlab结构体中的字段名确实是
v1到v17,没有拼写或格式错误 - scipy加载的标量结构体必须加
[0, 0]索引,否则会拿到一个(1,1)的数组而非实际结构体内容
内容的提问来源于stack exchange,提问作者M.D.
相关产品推荐
相关产品推荐

