用python 读取matlab 中的结构体 / 从numpy.void中提取数据

本文介绍了如何使用Python的scipy库读取MATLAB结构体数据,并展示了从numpy.void类型中提取数据的方法。通过load_params函数加载MAT文件,然后通过字段名直接访问结构体中的值。对于结构体嵌套的情况,可以通过递归访问获取所需数据。
摘要由CSDN通过智能技术生成

用python 读取matlab 中的结构体 / 从numpy.void中提取数据


前言

用python通过scipy 库读取mat文件,如果读取的是结构体,那么就会得到numpy.void 类型的数据。


一、简单的情形示例

要读取如图所示的mat文件中的数据
在这里插入图片描述
用scipy.sio.loadmat读取后得到的是:

def load_params(path,key_name):
    data = sio.loadmat(path)
    data = data[key_name]
    return data
mat_test=load_params(test_path, 'Test')
print(mat_test)
"""
[[(array([[12]], dtype=uint8), array(['abcde'], dtype='<U5'), 
array([[4096]], dtype=uint16), array(['C:/path'], dtype='<U7'),
array(['abcdefg'], dtype='<U7'), array([[1], [2], [3]], dtype=uint8))]]
"""

查看维度和类型

print(mat_test.shape)  # (1, 1)
print(type(mat_test))  # <class 'numpy.ndarray'>

进一步地

mat_data=mat_test[0][0]
print(type(mat_data))  # <class 'numpy.void'>
print(mat_data.shape)  # ()   这里得到了shape: ()
print(len(mat_data))   # 6   长度为6

为读取里面的数据

for item in mat_data:
	 print(item)

或者是

for i in range(len(mat_data)):
    print(mat_data[i])

得到结构体中的值

"""
[[12]]
['abcde']
[[4096]]
['C:/path']
['abcdefg']
[[1]
 [2]
 [3]]
 """

但如果已经知道结构体中的字段名,那么可以直接指定字段名,类似于字典的读取方式获取字段的值,如要获取字段 p 的值那么可以直接采用

mat_test=load_params(test_path, 'Test')  # 加载 mat 文件中的结构体 
mat_data=mat_test[0][0]['p']    # 获取结构体数据中的字段 p 对应的值 
print(mat_data)  # 值为12 

二、代码汇总

# 导入库和加载mat路径的部分在此省略
def load_params(path,key_name):
    data = sio.loadmat(path)
    data = data[key_name]
    return data
mat_test=load_params(test_path, 'Test')
print(mat_test)
print(mat_test.shape)
print(type(mat_test))
mat_data=mat_test[0][0]
print(mat_data)
print(type(mat_data))
print('the shape of the data', mat_data.shape)
print('the len of data ', len(mat_data))
print('--'*20)
for item in mat_data:
    print(item)
print('==='*20)
for i in range(len(mat_data)):
    print(mat_data[i])
mat_test=load_params(test_path, 'Test')  # 加载 mat 文件中的结构体 
mat_data=mat_test[0][0]['p']    # 获取结构体数据中的字段 p 对应的值 
print(mat_data)  # 值为12 

三、对于结构体嵌套的情况

如果matlab 的结构体中存在有嵌套,要获得嵌套的数据可以类似这样操作
比如,有这么一个mat1.mat文件,里面有结构体变量’A’,为获取该结构体变量

data_A=load(mat1.mat,'A')

如果结构体A有字段 a1,a2,a3,想要直接获取a3,那么可以有

data_a3=data_A[0][0]['a3']

如果a3字段本身也是结构体,a3结构体中有b1,b2,b3,字段,那么为了获取b3字段的内容,可以采用

data_b3=data_A[0][0]['a3'][0][0]['b3']
# 或者说是 data_b3=data_a3[0][0]['b3']

再多一层的嵌套,数据提取方法也是类似的。

----------------------- The END ----------------------------------------

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值