一、简单的情形示例

要读取如图所示的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']

但如果已经知道结构体中的字段名,那么可以直接指定字段名,类似于字典的读取方式获取字段的值,如要获取字段 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 ----------------------------------------

从numpy.void中提取数据目录从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] re
今天需要读取一个.mat文件结构体数据,看了各种博客,竟然没有对这方面的描述。都是读取简单的数据形式,没有涉及如何读取结构体里的矩阵。最后还是在一篇对scipy的英文介绍里找到了自己想要的。记录一下,万一有人和我有一样的需求。(看到了一个和我问题一样的帖子,100多天前到现在还没人回复) 结构体形式如下: 我需要的是SYSLoad里的数据,按照网上大部分的读取方式, X = loa...
想对文件所有图片按顺序(1.png;2.png;…1001.png;…1010.png.)读取后叠加,无奈你会发现在用dir读取的files.name的特性,排序放式并不是你想要的1,2…,100,这种方式,而是1,1001,1010,…,2,…这种方式。只能先对dir读取的files进行处理,因为files是结构体,所以涉及到针对结构体的一个成员排序。如果图片名字是1.png;2.png;…1001.png;…1010.png,还好做直接一顿操作猛如虎,但我图片名字是c1.png;c2.png;…c1001.png;…c1010.png,没办法┐(゚~゚)┌,只能一步一步来。
近期做做一个数据分析的文章,需要使用经典的近红外光谱数据集 corn NIR(网址:http://eigenvector.com/), 但是下载的数据是包含在一个数据,无法直接使用,需要进行数据读取,此时有以下学习收获: 1.在读取包含在结构体的近红外光谱数据之前,需要知道所需数据结构体内的名称,使用 fieldnames() 函数查看具体名称,以上述数据...
dataFile = r'D:\我的文件\我的数据\nclcolormap.mat' data = scio.loadmat(dataFile) colormap_all = data['nclcolormap'] # print(type(colormap_all)) BlAqGrYeOrRe = colormap_all['BlAqGrYeOrRe'.
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling ‘cublasCreate(handle)【pytorch err】
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling ‘cublasCreate(handle)【pytorch err】 pytorch 实现多维FFT