将你的科学计算从Matlab迁移到Python.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
将你的科学计算从Matlab迁移到Python.doc

窗体顶端 窗体底端 将你的科学计算从Matlab迁移到Python? 十一 26 马斯特斯特之学习研究 matlab, Python, 科学计算 9 Comments 为什么要用问句作为文章的标题呢,因为我的答案是NO!Absolutely Don’t! 一切的一切起源于我看了一篇英文文章,说使用Python作科学计算有时比Matlab更加高效,还有那无数次见到的牛逼公式:,看的我心潮澎湃,我就寻思了,反正最近在做的那个算法用Matlab跑实验跑得不是太理想,要不咱也迁移一把,由于今天比较蛋疼,就决定开始尝试了,经过蛋疼的一天,我得出了开头那个结论:如果你有现成的Matlab算法,还是Matlab吧,如果你像我一样蛋疼,那就迁移吧。不相信,那就听我把遇到的一堆乱七八糟的事情娓娓道来吧,其中夹杂着我的一些弱弱的解决方案~~ .mat数据集文件的导入 由于现有的数据集一般都是以Matlab的格式.mat的形式出现的,Matlab可以轻松的load语句搞定,但Python就不行了,花时间将mat文件提取成普通文本文件必然更心烦。其实这点Python肯定已经想到了,解决方案就是使用Scipy提供的函数,具体如下: 1 2 import scipy as sp dataset = sp.io.matlab.mio.loadmat(dataset_name) 其中dataset_name就是我们需要导入的.mat文件,但问题又来了,导入后返回的dataset变量是一个“字典”的数据结构,它的key就是储存的变量名称,而对应的value就是变量的内容。这个操作并不像Matlab那样直接将.mat里的变量载入workspace,那我们当然还需要进一步使dataset中存储的变量暴露出来,对应的内容赋给对应的变量名称。可以查看dataset变量的组成,发现除了我们自己的变量,还有另外三个小东西:’__globals__’,’__header__’,’__version__’,它们标识了.mat文件的基本信息,但我们并不需要,所以还需要去掉它们。最终,我们通过一段代码实现: 1 2 3 4 exclude = [__globals__,__header__,__version__] for obj in dataset.keys(): ????if obj not in exclude: ????????exec(obj + = dataset[ + obj + ] ) 通过exec我们就实现了类似语句 data = dataset[data] 的功能。OK,到这里,第一个任务完成,撒花~~可以看到,用Matlab一句load搞定的问题,这里搞了大半天。 迁移everything 由于我搞的是代码迁移,即将原来Matlab的代码改成Python代码,本来还觉得迁移就是稍微改改,最后发现要迁移不是一点,而是 almost? everything。首先一个最严重的问题:( ) 和 [ ] 的问题,这恐怕是迁移过程中最频繁的一个改动,这是为什么呢?很简单,因为Matlab中取矩阵元素(即Python中所说的‘slice’切片操作)用的是小括号,而Python中用的是中括号,还有比这更fuck的事情吗,因为函数调用也是小括号,所以放弃查找替换这不切实际的念头吧,这个恐怕只能手动。别以为这样就完事了,更琐碎的东西等着你,下面的表格可以帮助你理解什么是我说的everything。 操作 Matlab Python 注释 % # 开始索引 1 0 矩阵连接 [a, b] numpy.concatenate(a, b) 循环和分支语句 未结束的条件行以,结尾 结束需要end 未结束的条件行以:结尾 结束不需要任何东西 产生全0全1矩阵 zeros(m, n) 和 ones(m, n) numpy.zeros((m, n)) 和 numpy.ones((m, n)) 整除问题 / 直接取准确结果,不存在整除问题 / 两遍都是整数时为整除 分子或分母需要加float强制转换 乘方 a^b a**b 矩阵向量转置 单引号 ‘ 搞定 没有重载 ‘ 操作符,需要调用 .transpose 或 .T 结构体数组 直接{ }搞定 { }指的是字典数据结构,没有结构体的概念,只能使用“对象列表”搞定 向量矩阵相乘 a*b 代表正常的矩阵相乘,也就是说a的列数必须和b的行数匹配的那种 a.*b 代表对应元素相乘,即elementwise,a和b的维数必须相等 a*b 代表对应元素相乘,即elementwise,a和b的维数必须相等 dot(a, b) 代表正常的矩阵相乘,也就是说a的列数必须和b的行数匹配的那种 OK,这么些个问题需要解

文档评论(0)

wannian118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档