Matlab中的mat数据转成python中使用的npy数据遇到的坑及解决

 更新时间:2022年12月15日 08:37:28   作者:faithfulzl  
这篇文章主要介绍了Matlab中的mat数据转成python中使用的npy数据遇到的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

最近做的工作涉及将matlab中的处理好的mat数据转换成npy数据,送入到网络中学习。在处理数据时遇到的一些问题总结如下。

Matlab中的Cell

cell数组的数组(指的是两层cell)不能使用cell2mat函数

为了解决这个问题,涉及matlab中元组数据的读取和保存。

cell的读取

cell的{}是指向cell的内容,而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 重构 A 以定义 size(B)。

例如,reshape(A,[2,3]) 将 A 重构为一个 2×3 矩阵。

sz 必须至少包含 2 个元素,prod(sz) 必须与 numel(A) 相同。

% eg. 1: 将 1×10 向量重构为 5×2 矩阵。
A = 1:10;
B = reshape(A,[5,2])

每个维度的大小,指定为具有最多一个 [](可选)的两个或以上的整数。必须至少指定 2 个维度大小,并且最多一个维度大小可以指定为 [],这样会自动计算该维度的大小以确保 numel(B) 与 numel(A) 相匹配。

当使用 [] 自动计算维度大小时,显式指定的维度必须均匀划分为输入矩阵 numel(A) 中的元素数目。

对于第二个维度以上的维度,输出 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。

Please use HDF reader for matlab v7.3 files

matlab中对于较大打mat文件,都建议使用v7.3 来保存数据,但是scipy包中的loadmat函数不能读取这个版本的数据,搜了一下问题,发现h5py包中的File函数可以读取这个数据,添加h5py后使用h5py.File()函数就可以读取了。

IndexError: only integers, slices (:), ellipsis (...)……

经检查,错误之处在索引处使用了浮点数,把matlab中获得的数据强制转换成int型。

因为matlab中数据默认保存成double数据,所以如果转换到其他语言时,要注意到这一点,并且提前强制转换。

IndexError: index *** is out of bounds for axis 1 with size ***

问题在于下表越界,因为从matlab中获得的邻接矩阵记录邻居时,下标从1开始,而python中默认下标从0开始。

值得注意的是matlab中下标维度都是从1开始的,而且matlab中的矩阵读取顺序是列优先的,其他语言比如python和C++都是行优先的。所以数据迁移过去都需要先transpose。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python实现通过文件路径获取文件hash值的方法

    Python实现通过文件路径获取文件hash值的方法

    这篇文章主要介绍了Python实现通过文件路径获取文件hash值的方法,结合实例形式分析了Python针对文件进行hash运算的实现方法与相关注意事项,需要的朋友可以参考下
    2017-04-04
  • Python中的命令行参数解析工具之docopt详解

    Python中的命令行参数解析工具之docopt详解

    docopt 是一个用来解析命令行参数的工具,当想要在 Python 程序后面附加参数时,就不需要再为此而发愁了。下面这篇文章主要介绍了Python中命令行参数解析工具之docopt的相关资料,介绍的非常详细,需要的朋友们下面来一起看看吧。
    2017-03-03
  • Python中的QPixmap用法详解

    Python中的QPixmap用法详解

    QPixmap主要用于绘图,针对图像显示而最佳化设计,这篇文章主要介绍了Python中的QPixmap用法,对QPixmap使相关知识感兴趣的朋友一起看看吧
    2023-03-03
  • python fabric实现远程操作和部署示例

    python fabric实现远程操作和部署示例

    这篇文章主要介绍了python使用fabric实现远程操作和部署示例,需要的朋友可以参考下
    2014-03-03
  • elasticsearch python 查询的两种方法

    elasticsearch python 查询的两种方法

    这篇文章主要介绍了elasticsearch python 查询的两种方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • python中lxml.etree 和 ElementTree 的区别解析

    python中lxml.etree 和 ElementTree 的区别解析

    lxml.etree 提供了更多的功能,例如 XPath、XSLT、Relax NG、 和 XML 模式支持,etree 对 Python unicode 字符串的想法与 ElementTree 不同,本文给大家介绍python中lxml.etree 和 ElementTree 的区别,感兴趣的朋友一起看看吧
    2024-01-01
  • python实现棋盘覆盖问题及可视化

    python实现棋盘覆盖问题及可视化

    这篇文章主要给大家介绍了关于python实现棋盘覆盖问题及可视化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 在pycharm中设置显示行数的方法

    在pycharm中设置显示行数的方法

    今天小编就为大家分享一篇在pycharm中设置显示行数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python中的Decorator装饰器的使用示例

    Python中的Decorator装饰器的使用示例

    装饰器(decorator)在Python框架中扮演着重要角色,是Python中实现切面编程(AOP)的重要手段,本文将通过简单的示例和大家介绍下具体的使用方法,希望对大家有所帮助
    2022-12-12
  • Python 的Json 模块编码详解

    Python 的Json 模块编码详解

    这篇文章主要为大家介绍了Python 的Json 模块编码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-11-11

最新评论