Pythonは今、非常に伸び盛りのスクリプト言語です。文法が簡単で覚えやすいため、初心者でも取っ付き易いことが特徴です。その一方で、非常に多彩なライブラリが作られているため、奥が深く、書いていて面白い言語です。特に、科学技術計算では強力なライブラリが揃っています。
Pythonを始めとしたスクリプト言語は、(人間にとっての)書きやすさや読みやすさを上げることで、目的の機能を実装するためにかかる作業時間を短くできるという長所がある一方で、機械的には余分な動作(動的型付けなど)をすることになり、単純な演算でさえも結果的に低速になりがちという短所が存在します。特に、科学技術計算では、単純な演算を延々と繰り返し計算するというコードを書くことが多く、この短所が顕著に実行時間に効いてしまうため、スクリプト言語をこのような目的に使用するのは敬遠されてきました。また、どんな型であるか適当に言語が考えてくれる動的型付けは、ほとんど同じ型(doubleなど)を使用する科学技術計算では無駄が多くなります。
このような欠点を改善すべく、Python持ち前の書きやすさを活かし、静的型付け言語でコンパイルされた既存のコードを簡単にPythonから呼び出せるようにしたライブラリが作られました。これによって、C言語やFortranで書かれた洗練された数値計算ライブラリの良いところを受け継ぎつつ、それでいてPythonの非常に単純化されたインターフェイスでそれらを呼び出すことが出来るようになりました。この代表的なライブラリがNumPyやSciPyです。
簡単に高速な数値計算が出来るようになったおかげで、これらを利用した優れたライブラリが多く誕生しました。有名どころでは、機械学習に特化したscikit-learnが挙げられます。
これらのライブラリに共通しているのは、オープンライブラリであるという点です。つまり、全ての人がそのライブラリを発展させることが出来るということです。こういったライブラリの発展を支えているのは、活発なコミュニティが常に機能を改善しようと努力しているからです。その結果、私達のような利用者は、完成された機能を思う存分しゃぶり尽くすことが出来るのです。
このページでは、以下のような人を対象として、簡単にPythonを導入できる方法を紹介します。
Pythonは簡単さを謳う割には、ライブラリをとりあえず動かすまでに手間がかかることがあります。特にNumpyといったコンパイルが必要となるライブラリのインストールをするときに、エラーが出ることがあり、厄介です。
したがって、
導入時の面倒なことを避けるため、Anacondaによる導入を強くおすすめします。
「Anaconda で Python 環境をインストールする」が非常に参考になるので、あとはこれを見てください(丸投げ)。
Anacondaをインストールすると、様々な開発環境でPythonを書くことができます。一例として、
などがあります。これらの開発環境のベースは、すべてIPythonとなっています。
まずは、IPythonを起動して、どういうことができるかを確認するといいと思います。
大学のPython好きの有志で、(特に科学技術計算をしたい人向けの)Python入門用HPを作ったので、見てやってください。
このHPの各項目は、Jupyter Notebookによって書かれています。
このページに書かれていること
Pythonのライブラリは非常に多いため、どのライブラリがいいのか分からないことがあると思います。
このページでは、(私の主観で)知っておくと良いライブラリを挙げています。特に、科学技術計算に利用したい人を対象としています。
Pythonで科学技術計算をする上では必須となるライブラリです。ndarrayというクラスがあり、C言語の配列を内部で保持しているため、高速に動作します。
import numpy as np
x = np.linspace(0, 1, 10)
y = x ** 3
print(y)
グラフなど可視化のための定番のライブラリです。NumPyと同じように使う機会が非常に多くなるはずです。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 1)
y = np.linspace(-1, 1)
X, Y = np.meshgrid(x, y)
Z = np.sin(X**2 + Y**2)
plt.pcolor(X, Y, Z)
plt.colorbar()
plt.show()
import matplotlib.pyplot as plt
import numpy as np
plt.plot(np.random.choice([-1, 1], 1000).cumsum()) #一行でブラウン運動
plt.show()
高度な数値計算をするためのライブラリです。NumPyでも広い範囲をカバーしていますが、さらに高機能となっています。特殊関数やフィッティングなどを扱えます。
import matplotlib.pyplot as plt
import scipy.optimize as opt
import numpy as np
x = np.linspace(0, 1) # x軸の値
def func(x, a, b):
# フィッティングしたい曲線を定義
return a * x + b
a_true, b_true = 0.5, -1 # 真のパラメータ
y_true = func(x, a_true, b_true) # 真の値
y_obs = y_true + 0.05 * np.random.randn(x.size) # 正規分布ノイズを加えた観測データ
params_opt = opt.curve_fit(func, x, y_obs)[0] # 観測データを使ってフィッティング
plt.scatter(x, y_obs) # 観測データをプロット
plt.plot(x, func(x, *params_opt)) # 推定したパラメータで直線を描く
plt.show()
時系列などのデータ解析のためのライブラリです。内部でndarrayを保持しているため、大きなデータでも高速に扱うことが出来ます。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(low=10, high=30, size=(10, 4)),
columns=list("ABCD"),
index=pd.date_range(start="20180101", periods=10, freq="1W"))
df
# A B C D
#2018-01-07 29 16 23 20
#2018-01-14 24 25 27 25
#2018-01-21 14 26 22 16
#2018-01-28 18 22 16 20
#2018-02-04 29 19 15 21
#2018-02-11 21 20 25 19
#2018-02-18 14 21 22 24
#2018-02-25 15 25 26 10
#2018-03-04 29 29 15 20
#2018-03-11 18 17 14 11
df.describe()
# A B C D
#count 10.000000 10.000000 10.000000 10.000000
#mean 21.100000 22.000000 20.500000 18.600000
#std 6.261878 4.189935 5.016639 4.948625
#min 14.000000 16.000000 14.000000 10.000000
#25% 15.750000 19.250000 15.250000 16.750000
#50% 19.500000 21.500000 22.000000 20.000000
#75% 27.750000 25.000000 24.500000 20.750000
#max 29.000000 29.000000 27.000000 25.000000
df.plot()
半無限均質媒質中の変位や歪みを計算できる地球物理では有名なDC3D(Okada, 1992)を、Pythonから呼べるようにしたライブラリです。
from okada_wrapper import dc3dwrapper
import numpy as np
import matplotlib.pyplot as plt
alpha = 0.66 # 媒質定数
x = np.linspace(-20, 20) # x軸、y軸を定義 [km]
y = x.copy()
X, Y = np.meshgrid(x, y) # 地表のグリッドを定義
depth = 20 # 断層上端の深さ [km]
dip = 90 # 断層のdip [deg]
strike_width = [-5, 5] # 断層の走行方向の幅
dip_width = [0, 10] # 断層のdip方向の幅
disl = [100, 0, 0] # 滑り量 [cm]
U = []
for _x, _y in zip(X.ravel(), Y.ravel()): # グリッド一個一個で計算
xo = np.array([_x, _y, 0]) # 地表の観測点
status, u, grad_u = dc3dwrapper(alpha, xo, depth, dip, strike_width, dip_width, disl)
U.append(u) # 変位[cm]をリストに追加
U = np.vstack(U) # 変位をndarrayに変換。
# ↓↓ z方向地表変位の空間分布を可視化
plt.xlabel("X [km]")
plt.ylabel("Y [km]")
plt.pcolormesh(X, Y, U[:,-1].reshape(*X.shape))
plt.show()