Matlab mat转Python npy实战:Cell处理、维度变换及常见报错解析

小满
小满
发布时间:2026-10-12| 4人浏览过
原创

本文总结将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     
 end

Matlab中的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数据迁移过程中的经验总结,希望能提供有益参考,欢迎交流指正。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。