还剩5页未读,继续阅读
文本内容:
将你的科学计算从迁移到Matlab Python马斯H—26特斯特之学习研究科学计算matlab,Python,9Comments为什么要用问句作为文章的标题呢,因为我的答案是NO!Absolutely Dont!一切的一切起源于我看了一篇英文文章,说使用Python作科学计算有时比Matlab更加高效,还有那无数次见到的牛逼公式,看的我心潮澎湃,我就寻思了,反正最近在做的那个算法用Matlab跑实验跑得不是太理想,要不咱也迁移一把,由于今天比较蛋疼,就决定开始尝试了,经过蛋疼的一天,我得出了开头那个结论如果你有现成的Matlab算法,还是Matlab吧,如果你像我一样蛋疼,那就迁移吧不相信,那就听我把遇到的一堆乱七八糟的事情娓娓道来吧,其中夹杂着我的一些弱弱的解决方案〜〜数据集文件的导入■mat由于现有的数据集一般都是以Matlab的格式.mat的形式出现的,Matlab可以轻松的load语句搞定,但Python就不行了,花时间将mat文件提import scipyas sp取成普通文本文dataset=sp.io.matlab.mio.loadmat dataset_name件必然更心烦其实这点Python肯定已经想到了,解决方案就是使用Scipy提供的函数,具体如下12其中exclude=dataset_name就「—globals,_header,version_是我们需要导入]的.mat文件,但for objin dataset,keys:问题又来了,导if objnot inexclude:入后返回的exec obj+=dataset[/zdataset变量是一+ob j+〃]个“字典,,的数据结构,它的key就是储存的变量名称,而对应的value就是变量的内容这个操作并不像Matlab那样直接将.mat里的变量载入workspace,那我们当然还需要进一步使dataset中存储的变量暴露出来,对应的内容赋给对应的变量名称可以查看dataset变量的组成,发现除了我们自己的变量,还有另外三个小东西—globals—,,—header,—version,它们标识了.mat文件的基本信息,但我们并不需要,所以还需要去掉它们最终,我们通过一段代码实现1234通过exec我们就实现了类似语句data=dataset[data]的功能OK,到这里,第一个任务完成,撒花〜〜可以看到,用Matlab一句load搞定的问题,这里搞了大半天迁移everything由于我搞的是代码迁移,即将原来Matlab的代码改成Python代码,本来还觉得迁移就是稍微改改,最后发现要迁移不是一点,而是almost everythingo首先—个最严重的问题()和口的问题,这恐怕是迁移过程中最频繁的一个改动,这是为什么呢?很简单,Matlab Python因为Matlab中取矩阵元素(即Python中所说的slice切片操作)用的是小括号,而Python中用的是中括号,还有比这更fuck的事情吗,因为函数调用也是小括号,所以放弃查找替换这不切实际的念头吧,这个恐怕只能手动别以为这样就完事了,更琐碎的东西等着你,卜面的表格可以帮助你理解什么是我说的everythingo操作注释%#开始索引10矩阵连接[a,b]numpy.concatenatea,b未结束的条件行以,结尾结束需要未结束的条件行以结尾循环和分支语句end结束不需要任何东西numpy.zerosm,n和numpy.onesm,产生全0全1矩阵zerosm,n和onesm,nn/直接取准确结果,不存在整除问/两遍都是整数时为整除整除问题题分子或分母需要加float强制转换乘方aA ba**b没有重载操作符,需要调矩阵向量转置单引号’搞定用.transpose或.T{甘旨的是字典数据结构,没有结构体的结构体数组直接{}搞定概念,只能使用“对象列表”搞定a*b代表正常的矩阵相乘,也就是说a的列数必须和b的行数匹配的a*b代表对应元素相乘,即那种elementwise,a和b的维数必须相等a.*b代表对应元素相乘,即dota,b代表正常的矩阵相乘,也就是说aelementwise,a和b的维数必须向量矩阵相乘的列数必须和b的行数匹配的那种相等dota,b代表正常的矩阵相乘,也就是说aa.*b代表对应元素相乘,即的列数必须和b的行数匹配的那种elementwise,a和b的维数必须相等OK,这么些个问题需要解决,有些还是可以接受的,毕竟两个不同的语言嘛,操作符什么的不一样还行,有的就比较恶心了其中最让人难以理解的就是numpy的zeros和ones不明白为啥参数一定要是一个“元组”,不知道当初创造这个时怎么想的,搞的加了两层括号而最变态的就是矩阵向量的相乘了,Matlab分的很清,单独的*号就是矩阵相乘,而.*就是对应元素相乘,而Python中单独的*号表示元素相乘,作用与Matlab恰恰相反,真正的矩阵乘法居然需要调用dot函数才能完成,而dot只接受两个参数,可想而知,一堆矩阵相乘的时候得多壮观啊,譬如,类似的变态事还有矩阵连接,本来Matlab两矩阵放一起就能连接,Numpy非要用一个函数,你用函数我忍了,你还用那么长一个函数concatenate,要是连接几个矩阵咋办,一行能写下吗?大哥,我彻底凌乱了后话〜鉴于上述的种种让人闹心的原因,我的移植工作没有坚持下去当然,我写下这篇文章,并没有诋毁Python在做科学计算这方面的潜力,更没有贬低Python的意思,不得不承认接触Python越多,越觉得它牛逼,我仅仅表达的是要从Matlab迁移到Python有点得不偿失,或许一开始就直接从Python开始是个不错的选择,不存在迁移,直接从头开始但如果你想我一样,有现成的Matlab代码了,那咱就老实Matlab吧~~下载文章的PDF“批量重命名”小工具使用抓取网页以人人网新鲜事和团购网信息为例python9Comments qaddyours
1.H-一26,2010@21:56:07沙发没了Matlab这么牛逼?我就会在simulink里瞎拖拖回复H--26,2010@22:00:52你们主要用simulink仿真啊,拿东西看着很高级啊我们主要就是做科学计算用的咱沙发抢的真快回复
2.HYRYH--27,2010@19:21:28从字典更新全局变量可以这样做uglobals.updatex forx indataset.iteritems ifnot x
[0].startswith回复
3.HYRYI--27,2010@19:26:37a,b,c,d,e连dot乘可以:reducedot,a,b,c,d,e回复HYRY
4.-f-一27,2010@19:52:52除了concatenate之夕卜,可以用r_和c_对象:In
[29]:a=np.array[[1,2],[3,4]]In
[30]:b=np.array[[5,6]]In
[32]:np.r_[a,b]Out
[32]:array[[1,2],[3,4],[5,6]]In
[36]:np.c_[a,b.T]Out
[36]:array[[1,2,5],[3,4,6]]回复
5.HYRY27,2010@19:56:17不喜欢zeros的括号的话,可以这样做:def myzeros*a,**k:return np.zerosa,**k这样就不需要括号了,,myzeros2,3,4,dtype=T回复颖风H-一27,2010@21:24:26你的回复都很专业啊长知识了,呵呵,谢谢〜HMleeward
6.十二23,2010@04:50:08有个sage,博主有用过吗?也是用python的,是一个开源版的mathematics,matlab等颖风回复十二22,2010@20:52:53这个没试过,写完这文章才发现自己懂得很少啊,呵呵,主要觉得matlab不能有效利用所有内存,所以操作大规模数据时不方便,所以想尝试点别的。
个人认证
优秀文档
获得点赞 0