理论和应用并行,Python里不得不提的几个坑
自学的坏处非常多,很大的问题来源就是没法系统的学习知识。难免遇到许许多多的问题,有些问题在你学习过程中遇到的很明显,稍加练习就能发现,从而加以解决。但更多的问题需要在特定条件下才能被发现,等到你发现的时候,一拍脑袋,原来我一直都在错用的路上越走越远啊!有些小问题可能无伤大雅,但有些小问题很有可能成为你程序中的一个很大的BUG。
为了保持高产,也为了提醒自己,我整理了几个我遇到的非常二流子的问题,有可能对你有帮助,也有可能冒着被你取关的尴尬,分享出来,也希望大家相互学习、进步。
问题1:
Python的引用机制,有人也总结为python浅复制和深复制的问题。一个简单的例子,在Numpy中:
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的顺序一致,特别是在你的扩展名之前是一串数字的时候。我并不习惯于每次读取数据都去检查读取进来的文件或者名称是否全部正确(真不是我懒,是因为数据太多了),不过当我发现我的结果和预期相差甚多的时候,挠头的我就开始找原因了。
解决的办法是,
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
关注我们,了解更多
- .NET:Entity Framework 笔记
- redis 学习笔记(1)-编译、启动、停止
- 致研究者:2018 AI研究趋势
- redis 学习笔记(3)-master/slave(主/从模式)
- 解决Chrome或其它WebKit浏览器input和textarea的黄色/蓝色边框问题
- eclipse/intellij Idea集成jetty
- nginx学习(1):编译、安装、启动
- Immutable(不可变)集合
- nginx学习(2):启动gzip、虚拟主机、请求转发、负载均衡
- 使用WiX制作简单MSI安装程序
- 企业应用通用架构图
- CacheManager:–个通用缓存接口抽象类库
- silverlight: http请求的GET及POST示例
- 如何判断AI创造物能够成为“作品”?附独家视频讲解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《数据结构与算法_插入排序》
- UGL之标准位图
- Linux(Centos7.X ) 配置Java 环境变量
- CNS图表复现05—免疫细胞亚群再分类
- PAT (Basic Level) Practice (中文)1015 德才论 (25 分)
- 前端下载二进制流文件
- element-ui 表格打印
- PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
- 【Linux_Shell 脚本编程学习笔记二、打印菜单】
- PAT (Basic Level) Practice (中文)1017 A除以B (20 分)
- git commit 提交规范
- 非常量的引用左值问题
- PAT (Basic Level) Practice (中文)1019 数字黑洞 (20 分)
- 从 12.9K 开源项目学到的新东西
- PAT (Basic Level) Practice (中文)1048 数字加密 (20 分)