理论和应用并行,Python里不得不提的几个坑

2020-09-15 15:24:47 浏览数 (1)

自学的坏处非常多,很大的问题来源就是没法系统的学习知识。难免遇到许许多多的问题,有些问题在你学习过程中遇到的很明显,稍加练习就能发现,从而加以解决。但更多的问题需要在特定条件下才能被发现,等到你发现的时候,一拍脑袋,原来我一直都在错用的路上越走越远啊!有些小问题可能无伤大雅,但有些小问题很有可能成为你程序中的一个很大的BUG。

为了保持高产,也为了提醒自己,我整理了几个我遇到的非常二流子的问题,有可能对你有帮助,也有可能冒着被你取关的尴尬,分享出来,也希望大家相互学习、进步。

问题1:

Python的引用机制,有人也总结为python浅复制和深复制的问题。一个简单的例子,在Numpy中:

代码语言:javascript复制
a=np.array([[1,2,3],[2,3,4],[3,4,5]])
b=a
b[2,2]=7
a

发现了吗,我没有操作a,但a变了。假如a是你的原始数据,当你没有发现这个问题之前,你就这样写了,但原始数据不知不觉中被更改了。。。最终结果将与预期大相径庭。。。至少我挠头了好一阵。

解决办法也不少

采用b=a.copy,这样你的a就不会再被引用了。

问题2:

os库中的listdir函数,用以获取指定文件夹下的文件。前提条件是,假如你的文件名跟我很像:

而且你的文件数量又和我一样多~

恭喜,你要跟我一样注意这个问题咯。

略过无聊的问题来源吧,问题其实是,listdir读取的数据并不会和windows的顺序一致,特别是在你的扩展名之前是一串数字的时候。我并不习惯于每次读取数据都去检查读取进来的文件或者名称是否全部正确(真不是我懒,是因为数据太多了),不过当我发现我的结果和预期相差甚多的时候,挠头的我就开始找原因了。

解决的办法是,

代码语言:javascript复制
pmp='G:/fjsouthwestdatalist/pm/pm'
pmf=os.listdir(pmp)
pmf.sort(key=lambda x:int(x[:-4]))

我并没有发现os.listdir()中有解决问题的相关参数,所以在你读取文件名之后,重新进行排序,大概的意思是:扩展名之前的文件名重新排序,不过当你的扩展名长度跟我的不一样的话,4这个数字自然也要修改了。

这个问题给我的教训是,文件名的命名不能偷懒。

问题3:

这个问题我就不上具体代码了,主要想讲我遇到的理论问题。在空间插值问题中,有个挺好用的方法叫协变量插值。以克里金方法为例,称之为协同克里金。大家都知道,正常情况下,气温随着海拔的变化呈有规律的变化(主要指对流层中),每100m大约降低0.6°,是一个负相关的问题。而协同克里金可以通过协同高程数据,插值气温,大体上会有一个很不错的效果。为什么我要说大体上呢?因为在海拔接近0的附近,这个协同插值将产生极大的不稳定,特别是你的样本数据量少、插值范围小的时候,一定要注意。在我模型中的一部分内容中,我曾经尝试用协同方式替代普通克里金,在局部产生了极大的变异,总之慎用(这个部分我依然是用python实现的,所以我归纳到内容中了)!!!

问题4:

中文读写的编码问题,这个比较简单,但是我经常遇到。解决办法是,如果''UTF-8''依然产生乱码,就改用"GBK"吧!

问题5:

这是一个非常谜的问题,我用的编辑器是Anaconda 自带的Spyder,这个组合在我印象中不太稳定,偶尔会发生一些蜜汁问题,比如利用subprocess.call()调用一些cdm程序的时候,遇到一个问题,在运行python的时候问题反馈值为2,但是这个程序在cmd中运行正常,尝试许多次调试无果后。。。

所以最终怀疑是程序问题。解决办法也是window的大法,重启Anaconda。不得不说这个打法好,重启之后就正常运行。。。至今也不知道是什么bug

更新到这里吧~希望大家不要遇到这些糟心的问题。

欢迎关注公众号,作者不定期更新科研路上的磕磕绊绊。

微信号:一个有趣的灵魂W

关注我们,了解更多

0 人点赞