用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 ----------------------------------------