Matlab mat转Python npy实战:Cell处理、维度变换及常见报错解析
本文总结将Matlab mat数据转换为Python npy格式时遇到的核心问题与解决方案。重点解析多层Cell数组读取、cell2mat限制、reshape与permute维度操作差异,以及v7.3格式读取、浮点索引和行列优先导致的IndexError。通过具体代码示例,帮助开发者规避数据迁移中的常见陷阱,确保模型训练数据准确性。
近期工作涉及将Matlab处理后的mat数据转换为Python可用的npy格式,以便输入神经网络进行训练。在此过程中遇到若干典型问题,现整理如下供参考。
Matlab中的Cell
对于两层嵌套的Cell数组(即Cell中嵌套Cell),直接使用cell2mat函数会报错,无法直接转换。
为解决上述问题,需掌握Matlab中元胞数据的读取与保存方法。
Cell的读取
在Matlab中,使用{}访问Cell的内容,而使用()访问Cell本身的位置或结构。
Cell与Mat矩阵的转换
单个Cell转换为Mat矩阵时,可直接调用cell2mat函数。
cell2mat函数的作用是将元胞数组转换为普通矩阵,前提是所有Cell内容数据类型必须一致(如均为字符,则转换为字符矩阵)。
若遇到两层或更多层的Cell结构,需编写循环逐层读取数据,并存入新的数据结构中,无法直接一步转换。
for i=1:n_actions_train
for j=1:n_num
matrix_train(i,j,:,:,:)=train_fea{i}{j}; %train_fea是cell数据
end
endMatlab中的reshape和permute
reshape
该函数用于重构数据,将给定数据重排为指定尺寸(size)的新数组。
用法如下:
B = reshape(A,sz) B = reshape(A,sz1,...,szN)
B = reshape(A,sz),其中sz为大小向量,用于定义输出数组B的尺寸。
例如,reshape(A,[2,3])将数组A重构为2行3列的矩阵。
sz向量至少包含2个元素,且sz中所有元素乘积必须等于输入数组A的元素总数numel(A)。
% eg. 1: 将 1×10 向量重构为 5×2 矩阵。 A = 1:10; B = reshape(A,[5,2])
指定维度大小时,需为两个或更多整数,其中最多允许一个维度指定为[](自动计算)。指定维度的大小必须能整除输入数组的元素总数,以确保输出数组B的元素总数与A一致。
当使用[]自动计算某维度大小时,其他显式指定的维度必须均匀划分输入矩阵A的元素数目。
对于超过第二维度的维度,若尾部维度大小为1,输出B将省略这些大小为1的尾部维度。例如,reshape(A,3,2,1,1)生成的结果仅为3×2矩阵。
permute
该函数用于置换数组的维度顺序。
B = permute(A,dimorder) eg. 1 : 创建一个 3×4×2 数组并对其进行置换,交换第一个维度和第三个维度,从而得到 2×4×3 数组. A = rand(3,4,2) B = permute(A,[3 2 1])
reshape与permute的主要区别在于:reshape改变数据的维度形状但保持数据总量不变,仅重新排列行列组合,各维度size可能变化;而permute仅调整维度顺序,不改变各维度的具体size。
permute常用于提取特定维度间的子矩阵。例如,若需获取某两个维度构成的矩阵,可先用permute将这两个维度调整至前方,便于后续索引操作。
需注意,permute函数不会改变每个维度的size,仅改变其排列顺序。
Please use HDF reader for matlab v7.3 files
Matlab中保存较大mat文件时,推荐使用v7.3格式。然而,Python中scipy库的loadmat函数不支持读取该版本数据。经排查,可使用h5py库中的File函数进行读取,添加h5py依赖后调用h5py.File()即可解决。
IndexError: only integers, slices (:), ellipsis (...)……
经检查,该错误源于索引处使用了浮点数。由于Matlab中数据默认保存为double类型,在转换至其他语言时,需手动将其强制转换为int型,否则会导致索引错误。
因此,从Matlab导出数据至其他语言时,务必注意数据类型转换,提前将double强制转换为整型以避免此类问题。
IndexError: index *** is out of bounds for axis 1 with size ***
该错误通常由索引越界引起。Matlab中获取的邻接矩阵在记录邻居时,下标从1开始;而Python默认下标从0开始,直接迁移会导致越界。
值得注意的是,Matlab中所有维度下标均从1开始,且矩阵读取顺序为列优先;而Python和C++等语言通常为行优先。因此,在数据迁移至Python时,通常需要先进行转置(transpose)操作以匹配内存布局。
总结
以上为个人在处理Matlab至Python数据迁移过程中的经验总结,希望能提供有益参考,欢迎交流指正。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









