Home 私って誰 Python 作ったもの 日々の雑感 リンク
English
Home 私って誰 Python 作ったもの 日々の雑感 リンク
Pythonについて 導入方法 開発環境 Python入門 主なライブラリ

Pythonについて

科学技術計算にPythonを使いたい人を対象としています。

Pythonとは?

Pythonは今、非常に伸び盛りのスクリプト言語です。文法が簡単で覚えやすいため、初心者でも取っ付き易いことが特徴です。その一方で、非常に多彩なライブラリが作られているため、奥が深く、書いていて面白い言語です。特に、科学技術計算では強力なライブラリが揃っています。

どうしてPython?

Pythonを始めとしたスクリプト言語は、(人間にとっての)書きやすさや読みやすさを上げることで、目的の機能を実装するためにかかる作業時間を短くできるという長所がある一方で、機械的には余分な動作(動的型付けなど)をすることになり、単純な演算でさえも結果的に低速になりがちという短所が存在します。特に、科学技術計算では、単純な演算を延々と繰り返し計算するというコードを書くことが多く、この短所が顕著に実行時間に効いてしまうため、スクリプト言語をこのような目的に使用するのは敬遠されてきました。また、どんな型であるか適当に言語が考えてくれる動的型付けは、ほとんど同じ型(doubleなど)を使用する科学技術計算では無駄が多くなります。

このような欠点を改善すべく、Python持ち前の書きやすさを活かし、静的型付け言語でコンパイルされた既存のコードを簡単にPythonから呼び出せるようにしたライブラリが作られました。これによって、C言語やFortranで書かれた洗練された数値計算ライブラリの良いところを受け継ぎつつ、それでいてPythonの非常に単純化されたインターフェイスでそれらを呼び出すことが出来るようになりました。この代表的なライブラリがNumPySciPyです。

簡単に高速な数値計算が出来るようになったおかげで、これらを利用した優れたライブラリが多く誕生しました。有名どころでは、機械学習に特化したscikit-learnが挙げられます。

これらのライブラリに共通しているのは、オープンライブラリであるという点です。つまり、全ての人がそのライブラリを発展させることが出来るということです。こういったライブラリの発展を支えているのは、活発なコミュニティが常に機能を改善しようと努力しているからです。その結果、私達のような利用者は、完成された機能を思う存分しゃぶり尽くすことが出来るのです。

導入方法

このページでは、以下のような人を対象として、簡単にPythonを導入できる方法を紹介します。

  • Pythonを使ってみたいけど、入れ方がよく分からない
  • 入れてみたけど、ライブラリのインストール方法が分からない
  • Python IDLEを使っている

Pythonは簡単さを謳う割には、ライブラリをとりあえず動かすまでに手間がかかることがあります。特にNumpyといったコンパイルが必要となるライブラリのインストールをするときに、エラーが出ることがあり、厄介です。

したがって、

導入時の面倒なことを避けるため、Anacondaによる導入を強くおすすめします。

「Anaconda で Python 環境をインストールする」が非常に参考になるので、あとはこれを見てください(丸投げ)。

開発環境

Anacondaをインストールすると、様々な開発環境でPythonを書くことができます。一例として、

  • Spyder

    IPythonとエディタ一体型の科学技術計算を得意とした統合開発環境。
  • IPython

    軽量かつ高機能である対話形式の実行環境。標準のIDLEに比べ、補完機能やヘルプ機能がはるかに便利で使いやすく、主に統合開発環境でもこれを利用している。
  • Jupyter Notebook

    ローカルのサーバでIPythonを起動し、ブラウザを通してPythonを実行できる、今流行りの開発環境。慣れてきたらオススメ。

などがあります。これらの開発環境のベースは、すべてIPythonとなっています。

まずは、IPythonを起動して、どういうことができるかを確認するといいと思います。

Python入門

大学のPython好きの有志で、(特に科学技術計算をしたい人向けの)Python入門用HPを作ったので、見てやってください。

このHPの各項目は、Jupyter Notebookによって書かれています。

このページに書かれていること

  • Pythonの主な文法
  • 文字列操作やファイル操作といった標準ライブラリの使い方
  • Numpyやmatplotlibなどの主要なライブラリの基本的な使い方
  • Pythonを使った、シェルスクリプトのように自動化をするためのファイル操作
  • 高度な可視化やデータ分析のための、より発展的なライブラリの紹介

Pythonのライブラリ

Pythonのライブラリは非常に多いため、どのライブラリがいいのか分からないことがあると思います。

このページでは、(私の主観で)知っておくと良いライブラリを挙げています。特に、科学技術計算に利用したい人を対象としています。

  • NumPy(公式ドキュメント

    Pythonで科学技術計算をする上では必須となるライブラリです。ndarrayというクラスがあり、C言語の配列を内部で保持しているため、高速に動作します。

    import numpy as np
    x = np.linspace(0, 1, 10)
    y = x ** 3
    print(y)
  • matplotlib(公式ドキュメント

    グラフなど可視化のための定番のライブラリです。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()
  • SciPy(公式ドキュメント

    高度な数値計算をするためのライブラリです。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()
    
  • Pandas(公式ドキュメント

    時系列などのデータ解析のためのライブラリです。内部で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()
  • okada_wrapper (github

    半無限均質媒質中の変位や歪みを計算できる地球物理では有名な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()