科学计算工具和工作流

Published on Sep 12, 2012

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.

在编辑器中拟定算法

在文本编辑器中创建一个文件=myfile.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

从脚本到函数

虽然只用一个接一个指令的脚本工作很诱惑,但请逐渐将脚本改进成一套函数:

  • 一个脚本不可复用,但函数可以。
  • 以函数式思考益于将问题分解。

Footnotes:

1

在python2.7以后不会这样显示了。

2

Enthought公司配置好的一套环境,教育网邮箱可以免费申请使用。

3

另一个配置好的环境。