【debug记录】MATLAB内置reshape与Python NumPy库reshape的差异

【debug记录】MATLAB内置reshape与Python NumPy库reshape的差异

  • 背景
  • 函数原型
    • MATLAB内置reshape
    • NumPy库reshape
  • 差异分析
  • 解决方法

背景

最近在编程时遇到一个需求,需要将MATLAB工具箱中的函数用Python NumPy库进行实现,在对实现进行验证的过程中,遇到输入相同,但MATLAB和NumPy的计算输出不一致的问题。

排除计算精度问题后,经过多次debug发现,这是由于MATLAB内置reshape与NumPy库reshape的默认操作方向不同。

函数原型

MATLAB内置reshape

MATLAB内置reshape的函数原型为1

  • B = reshape(A,sz)
  • B = reshape(A,sz1,...,szN)

输入
A:待重构的数组,可以是向量、矩阵或多维数组等。
sz:输出大小,是一个由整数组成的行向量。
sz1,...,szN:每个维度的大小,必须是整数。

输出
B:重构的数组,数据类型和元素数与输入A中的数据类型和元素数相同。

NumPy库reshape

NumPy库reshape的函数原型为2

b = numpy.reshape(a, shape=None, order='C', newshape=None, copy=None)

输入
a:待重构的数组,ndarray类型。
shape:输出大小,是一个int或int元组。如果是int,则重构的数组将是该shape的一维数组。一个shape的维度可以是-1。在这种情况下,shape的值是根据数组的长度和剩余维度推断出来的。
order:可选参数,通过字符集{‘C’, ‘F’, ‘A’}中的任一字符指定reshape操作的顺序,默认值为’C’。

可选字符含义
‘C’使用类似C语言的索引顺序读取/写入元素
‘F’使用类似Fortran语言的索引顺序读取/写入元素
‘A’如果a在内存中是类似Fortran语言连续的,则以类似Fortran语言的索引顺序读取/写入元素,否则以类似C语言的顺序

newshape:自2.1版起已弃用,由shape参数替代。保留以保持向后兼容。
copy:可选参数,布尔类型,默认值为None。

可选值含义
True数组数据进行复制
None仅在order参数设置中被需要时,才会进行复制
False数组数据不会进行复制,但可能在数组数据必须被复制时引发错误

输出
b:重构的数组,数据类型和元素数与输入a中的数据类型和元素数相同。

差异分析

在默认情况下,即NumPy库reshape函数的order参数为'C'时,reshape操作使用的是行主序,这意味着在多维数组中,元素是按行来存储的,因此NumPy是根据行的方向进行reshape操作。

同样在默认情况下,MATLAB内置reshape操作使用的是列主序,即MATLAB是根据列的方向进行reshape操作。

具体地,以一个行向量数据[1, 2, 3, 4]为例,将其reshape成(2, 2)的形状。NumPy库reshape会优先考虑在行方向上填充内容,即[1, 2]作为第一行,剩下的[3, 4]作为第二行,最终reshape结果为[[1, 2], [3, 4]];MATLAB内置reshape优先考虑在列方向上填充内容,即[1, 2]作为第一列,剩下的[3, 4]作为第二列,最终reshape结果为[[1, 3], [2, 4]]

解决方法

基于上述内容,由于MATLAB内置reshape没有提供操作方向的可选参数,如果需要NumPy库的reshape与MATLAB内置reshape的输出一致,那么可修改NumPy库reshape的操作方向,使其与MATLAB内置reshape操作方向一致,即将NumPy库reshape的参数order设置为'F'


  1. MATLAB reshape帮助文档 ↩︎

  2. NumPy reshape文档 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu23.10下解决C语言调用mysql.h问题

Ubuntu23.10下解决C语言调用mysql.h问题 导语环境准备问题和解决方案总结参考文献 导语 在学习C语言和MySQL的调用的时候遇到包和版本的问题,由于使用的书很老(10年的),因此很多MySQL的包已经过时,在查找很多资料和询…

【JAVA毕业设计】基于Vue和SpringBoot的微服务在线教育系统

博主说明:本文项目编号 T 060 ,文末自助获取源码 \color{red}{T060,文末自助获取源码} T060,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

Spring Boot编程训练系统:技术实现与案例分析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

在 ASP.NET Core 6.0 中使用 Swagger/OpenAPI 丰富 Web API 文档

示例代码:https://download.csdn.net/download/hefeng_aspnet/89961435 介绍 在选择或尝试与 API 集成之前,大多数开发人员都会查看其 API 文档。保持 API 文档更新以反映软件更改是一项挑战,需要时间和精力。对于 Web API,我们…

tensorflow案例5--基于改进VGG16模型的马铃薯识别,准确率提升0.6%,计算量降低78.07%

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 本次采用VGG16模型进行预测,准确率达到了98.875,但是修改VGG16网络结构, 准确率达到了0.9969,并且计算量…

Spring Boot编程训练系统:构建可扩展的应用

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足,创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分&…

Java-sec-code-SSRF攻击

Java-sec-code(SSRF攻击) java-sec-code平台中也内置了SSRF攻击案例,我们来看看SSRF漏洞代码是什么样的。 案例1 直接从url参数接收数据,但是未进行任何检查和校验。 通过调用httpUtil.URLConnection方法,建立URL对…

docker基础:搭建centos7(详见B站泷羽sec)

docker的简单学习: sudo apt-get update //这个命令让系统检查有没有新软件 sudo apt-get install docker.io //安装 Docker sudo docker version //查看是否安装成功,显示docker的版本信息 启用Docker 启…

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络(CNN,全连接网络)的流程是前向传播、反向传播和参数更新,存在以下不足: 无法处理时序数据:时序数据长度一般不固定,而前馈神经网络要求输入和输出的维度是固定的&a…

解剖C++模板(2) —— 模板匹配规则及特化

众所周知,模板声明部分的尖括号中的内容是声明模板形参,而调用模板时的尖括号是给模板传参。然而这样理解仅仅停留于现象,只是将模板形参传参和函数传参的过程划等号了。C 的函数重载匹配并非真的进行匹配,因为函数名修饰规则导致…

题目讲解15 合并两个排序的链表

原题链接: 合并两个排序的链表_牛客题霸_牛客网 思路分析: 第一步:写一个链表尾插数据的方法。 typedef struct ListNode ListNode;//申请结点 ListNode* BuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node->…

高性能Web网关:OpenResty 基础讲解

一:概述 OpenResty是由国人章亦春开发的一个基于Nginx的可伸缩的Web平台。 openresty 是一个基于 nginx 与 lua 的高性能 web 平台,其内部集成了大量精良的 lua 库、第三方模块以及大数的依赖项。用于方便搭建能够处理超高并发、扩展性极高的动态 web 应…

OceanBase JDBC (Java数据库连接)的概念、分类与兼容性

本章将介绍 OceanBase JDBC的 概念与分类,已帮助使用 JDBC 的用户及技术人员更好的 了解JDBC,以及 OceanBase JDBC在与 MySQL 及 Oracle 兼容性方面的相关能力。 一、JDBC 基础 1.1 JDBC 的概念 JDBC 一般指 Java 数据库连接。Java 数据库连接&#xf…

小程序中引入下载到本地的iconfont字体图标加载不出来问题解决

我这个是uniapp项目,字体图标都是一样的,在vue项目中web端、uniapp运行到h5都没问题,但是运行到小程序加载不出来,报错如下: 不让用本地路径,所以我们要转为base64编码,这里给大家提供一个工具,它可以把本地字体文件转为base64:transfonter 进入官网后,第一步: …

如何在 Ubuntu 24.04 上安装和配置 Fail2ban ?

确保你的 Ubuntu 24.04 服务器的安全是至关重要的,特别是如果它暴露在互联网上。一个常见的威胁是未经授权的访问尝试,特别是通过 SSH。Fail2ban 是一个强大的工具,可以通过自动阻止可疑活动来帮助保护您的服务器。 在本指南中,我…

多商户中英双语电商系统设计与开发 PHP+mysql

随着全球电商市场的扩展,多商户平台成为了越来越多商家参与全球贸易的重要方式。为了适应不同语言用户的需求,尤其是中英双语用户的需求,设计一个支持中英双语的电商系统显得尤为重要。本文将重点探讨如何设计一个多商户中英双语电商系统&…

关于 3D Engine Design for Virtual Globes(三维数字地球引擎设计)

《3D Engine Design for Virtual Globes》是一本专注于三维虚拟地球引擎设计的专业书籍。这本书由Patrick Cozzi和Kevin Ring编写,覆盖了设计适用于虚拟球面环境的三维引擎的各个方面。虚拟地球引擎作为地理信息系统(GIS)中的一个核心组件&am…

单元测试、集成测试、系统测试有什么区别

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 单元测试、集成测试、系统测试有什么区别 1、粒度不同 集成测试bai粒度居中,单元测试粒度最小,系统du测试粒度最大。 2、测试方式不同…

CE2.【C++ Cont】练习题组2

1.数字反转 https://www.luogu.com.cn/problem/P5705 题目描述 输入一个不小于 100100 且小于 10001000,同时包括小数点后一位的一个浮点数,例如 123.4123.4 ,要求把这个数字翻转过来,变成 4.3214.321 并输出。 输入格式 一行一个…

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…