Pythonを自然科学の標準プログラミング言語にしたい

アカデミックでもみんなPython使おうよ!というお話。特に、プログラミングがあくまで研究手段というスタンスの人には向いていると思う。一方で、情報系でシステム評価やってますという人や、大規模計算やってますという人は、今まで通りCやFORTRANを使ったほうがいい。

Pythonを薦める理由

  • 構文が簡単。プログラミングの勉強にはあまり割きたくない場合や、コンパイルエラーに付き合っている時間がない人に。
  • コードが見やすい。他の人が書いたコードや、自分が昔書いたコードの理解に費やす時間を削減できる。「動く擬似コード」とも呼ばれる。
  • パッケージが豊富。特に、NumPy・SciPyなどの科学計算に使えるパッケージが無料で提供されているのは、研究に使う上では大きい。

Pythonのアレな点

一番は、日本ではマイナー言語だということ。最近はかなり日本語の情報も増えてきたけれど、スクリプト言語の中でも、RubyPerlに比べるとやっぱり国内ではマイナー。なので、研究室や周りに使っている人がいないと、Pythonを押し切って使うのはキツいかも。

NumPyとSciPy

フリーのMATLABクローンだと思えば良い。たとえばこんな機能がある:
行列式

>>> A = mat('[8, 3, 2, -5; 4, -1, 2, 3; 5, 6, 2, 3; 1, 6, 2, 7]')
>>> linalg.det(A)
255.99999999999994

逆行列

>>> linalg.inv(A)
matrix([[-0.21875,  0.09375,  0.5625 , -0.4375 ],
        [ 0.03125, -0.15625,  0.0625 ,  0.0625 ],
        [ 0.78125,  0.09375, -1.5625 ,  1.1875 ],
        [-0.21875,  0.09375,  0.3125 , -0.1875 ]])

積分

>>> scipy.integrate.quad(lambda x: exp(-x**2), 0, Inf)
(0.8862269254527579, 7.101318390472462e-09)

matplotlibというパッケージを使えば、グラフ描画も出来る。参考:Screenshots — Matplotlib 1.3.1 documentation

Sympy

Mathematicaのような数式処理が欲しいなら、Sympyというパッケージがある。
文字式

>>> x = Symbol('x')
>>> y = Symbol('y')
>>> ((x+y)**2).expand()
x**2 + 2*x*y + y**2

極限

>>> limit(sin(x)/x, x, 0)
1

常微分方程式

>>> x = Function('x')
>>> t = Symbol('t')
>>> dsolve(x(t).diff(t) - 2*x(t)*(1-x(t)), x(t), hint='best')
x(t) == exp(2*t)/(C1 + exp(2*t))

Gröbner基底

>>> x = Symbol('x')
>>> y = Symbol('y')
>>> groebner([x*y - 2*y, 2*y**2 - x**2], order='grevlex')
[x**3 - 2*x**2, -x**2 + 2*y**2, x*y - 2*y]