Scientific computing with tools and workflow
好长的标题……
从scipy lecture notes引言翻译。这是篇python 做科学计算的水文……
作者:Fernando Perez, Emmanuelle Gouillart, Gaël Varoquaux。感谢他们贡献了如此棒的教材。
目录
- toc
{: toc}
为什么Python?
科学家的需求
- 获取数据(模拟,试验操控)
- 操作和处理数据
- 可视化结果……让我们理解我们在做什么!
- 交流结果:产生用来做报告或出版的图像,写演示文稿。
要求
- 对相应经典数值方法和基本作用已经存在丰富的程序块:我们不想再次为绘制曲线、傅利叶变换或者拟合算法重新编程。不要重复发明轮子。
- 简单易学:计算机科学不是我们的课程也不是工作。我们想要在几分钟内绘制曲线、平滑信号和做傅利叶变换。
- 易于和合作者、学生、顾客交流,让代码在试验室或公司内部都生动起来:代码应该像本书一样易读。因此,语言应该包含尽量少的语法符号或不必要的规范,使数学家和科学家读者能够理解代码。
- 有效率地编码和快速执行……但是不必说如果我们花太多时间来编写它,非常快的代码也变得无用。所以,我们需要同样短的开发时间和短的执行时间。
- 一个单独的环境/语言解决所有事情。如果可能,避免为每个新问题学习新的软件。
已经存在的解决方案
科学家们用什么工作?
编译语言:C,C++,Fortran等等
- 优点:
- 非常快。高度优化的编译器。对大量计算,很难超越这些语言。
- 为这些语言已经写了一些高度优化的科学库。例如:BLAS(向量/矩阵运算库)
- 缺点:
- 难用:在开发时没有交互,命令式的编译步骤,累赘的语法(
&, ::, }}, ;
等等),人工内存管理(C中很棘手)。这些对非计算机科学家是难懂的语言。
- 难用:在开发时没有交互,命令式的编译步骤,累赘的语法(
脚本语言:Matlab
- 优点:
- 在许多领域有丰富的数值算法库。因为这些库经常用编译语言写成而有快的执行速度。
- 友好的开发环境:全面而且组织良好的帮助,集成的编辑器等。
- 商业支持
- 缺点:
- 基本语言太弱了,高级用户将很受限。
- 不免费
其它脚本语言:Scilab, Octave, Igor, R, IDL等等
- 优点:
- 开源、免费,或者至少比Matlab便宜。
- 有些功能非常高级(R中的统计,Igor中的绘图等等)
- 缺点:
- 比Matlab中可用算法少,语言不高级。
- 有些软件专注于一个领域。例如:Gnuplot或xmgrace绘制曲线。这些程序非常强大,但是它们被限制在一种类型的使用上,例如绘图。
Python怎么样
- 优点:
- 非常丰富的科学计算库(尽管稍微比Matlab少那么一点点)
- 很好的思考语言,允许写出非常易读和组织很好的代码:“所码即所想” 。
- 相当之多科学计算任务之外的库(网络服务器管理、串口访问等等。)
- 自由免费和开源,使用广泛,活跃的社区。
- 缺点:
- 不怎么友好的开发环境和某些软件相比,比如Matlab。(更加geek向一些)。
- 并非所有的算法可以在专业软件和工具箱中找到。
python科学工具
不像Matlab,Scilab和R,Python并不预先绑定一套科学计算模块。以下是用来搭建科学计算环境的基本构建模块:
-
Python,一个通用和现代的计算语言
- Python语言:数据结构(字符串、整型),控制流,数据集合(列表、字典),模式等等。
- 标准库的模块
- 大量用Python写成特殊用途的模块或应用:网络协议,网络框架等等,还有科学计算。
- 开发工具(自动测试,文档生成)
-
IPython,一个高级Python shell http://ipython.scipy.org/moin/
-
Numpy,提供强大的数值数组对象和操作它们的程序。http://www.numpy.org/
-
Scipy:高水准的数据处理程序。优化、回归、插值等等。http://www.scipy.org/
-
Matplotlib:二维可视化,“出版水准”的绘图。http://matplotlib.sourceforge.net/
-
Mayavi:三维可视化。http://code.enthought.com/projects/mayavi/
交互工作流:IPython和文本编辑器
交互工作来测试和理解算法:在这一部分,我们描述一个使用IPython交互工作流,这很方便探索和理解算法。
Python是一种通用语言。因此,没有一个得天独厚的工作环境,使用它的方式不只一种。尽管这让初学者很难找到自己的路,但让Python可能被用来在服务器上或嵌入设备上写程序。
注解:这部分的参考文档:
IPython用户手册:http://ipython.org/ipython-doc/dev/index.html
命令行交互
启动ipython:
In [1]: print('Hello world')
Hello world
获得帮助^1:
In [2]: print?
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function print>
Namespace: Python builtin
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
在编辑器中拟定算法
在文本编辑器中创建一个文件my_file.py
。在EPD(Enthought Python Distribution)^2中,你可以使用从开始菜单使用Scite。在Python(x,y)中^3,你可以使用Spyder。在Ubuntu下,如果你还没有喜欢的编辑器,我们建议安装Stani’s Python editor。在这个文件中,添加以下行:
s = 'Hello world'
print(s)
现在,你可以在IPython中运行和探索结果变量:
In [3]: %run my_file.py
Hello word
In [4]: s
Out[4]: 'Hello word'
In [5]: %whos
Variable Type Data/Info
----------------------------
s str Hello word
从脚本到函数
虽然只用一个接一个指令的脚本工作很诱惑,但请逐渐将脚本改进成一套函数:
- 一个脚本不可复用,但函数可以。
- 以函数式思考益于将问题分解。