python による科学技術計算samples.leanpub.com/scp01-sample.pdfiii はじめに...

35
Python による科学技術計算 基礎編 かくあき著

Upload: others

Post on 24-Jan-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • Python による科学技術計算基礎編

    かくあき著

  • ii まえがき

    まえがき

    サポートページ

    本書のサポート情報は、下記のWebページに掲載いたしますのでご確認ください。http://org-technology.com/books/SCP01.html

    注意

    • 本書の内容につきましては、システム環境の違いにより必ずしも同一の結果にならない場合があります。

    • お客様が本書の情報を運用された結果については、著者はいかなる責任も負いません。• 本書記載の社名、商品名、およびシステム名称は、一般に各開発メーカの商標または登録商標です。

    • 本書では登録商標などを一般に使われている通称を用いる場合があります。• 本書では ®などの記号は省略しています。• 本書執筆は Linux 4.4.0(Ubuntu 16.04 LTS)にて動作確認を行っています。

    出版情報

    • 2016年 4月 24日初版• 2016年 4月 25日 1.1版• 2016年 9月 6日 1.2版

    http://org-technology.com/books/SCP01.html

  • iii

    はじめに

    最近のコンピュータは非常に進歩しており、個人用のものでも実用的に数値計算が行える

    十分な能力を持っています。ハードウェアと同じくソフトウェア環境も大幅に進歩しており、

    その中でも最も急成長し、注目されているプログラミング言語の一つが Pythonです。科学や工学分野の問題を分析・解決するために、コンピュータで計算できる数学モデルを

    作成し、数値計算を行う一連の手法を科学技術計算と言います。本書は、科学技術計算に

    Pythonを使えるようになるための入門書です。Python自体の基本事項から解説し、初めてPythonを学ぶ人にも取り組みやすいように心がけました。また、応用例も理工系の大学の初年度で学ぶような基本的な数学のトピックに絞り、あまり難解にならないようにしました。

    本書の構成は次のようになっています。1 章と 2 章では Python 自体の初学者に向けて、Pythonを使用する準備と、基本的な Pythonの文法や構造を解説します。

    3 章から 5 章では、配列計算、記号計算、データの可視化を行うための基本ライブラリ(NumPy、SymPy、Matplotlib)の使用方法を説明します。6章ではこれらの応用例として線形方程式系の解法、補間、積分といった基本的な数値計算を扱う構成としています。

    7章では Pandasライブラリによるデータ分析の基本、8章では様々なファイル形式を使ったデータの入出力方法を説明します。ここまで学べば Pythonを科学技術計算の実用的な道具として使えるようになっているはずです。

    9章では Numbaと Cythonライブラリを用いて Pythonのコードを高速化する方法、10章では Pythonから R、Scilab、Octaveといったデータ分析や科学技術計算に特化した言語を利用する方法を説明します。Pythonの数値計算ライブラリを用いた計算の速度や機能に不足を感じた場合、これらの章のトピックが役に立つでしょう。

  • iv 目次

    目次

    はじめに iii

    目次 iv

    図一覧 xii

    表一覧 xv

    第 1章 導入 11.1 Python環境の導入 . . . . . . . . . . . . . . . . . . . . . . 1

    1.1.1 環境の構築 . . . . . . . . . . . . . . . . . . . . . . 21.2 Pythonインタープリタ . . . . . . . . . . . . . . . . . . . . 51.3 IPythonコンソール . . . . . . . . . . . . . . . . . . . . . . 6

    1.3.1 入出力 . . . . . . . . . . . . . . . . . . . . . . . . 71.3.2 入力補完 . . . . . . . . . . . . . . . . . . . . . . . 91.3.3 シェルコマンドの呼び出し . . . . . . . . . . . . . . 101.3.4 マジックコマンド . . . . . . . . . . . . . . . . . . 101.3.5 プログラムの性能評価 . . . . . . . . . . . . . . . . 111.3.6 デバッガ . . . . . . . . . . . . . . . . . . . . . . . 13

    1.4 モジュールの利用 . . . . . . . . . . . . . . . . . . . . . . . 161.4.1 インポート . . . . . . . . . . . . . . . . . . . . . . 161.4.2 検索パス . . . . . . . . . . . . . . . . . . . . . . . 18

    1.5 Jupyter Notebook . . . . . . . . . . . . . . . . . . . . . . 191.6 Spyder . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    第 2章 Python プログラミングの基本 252.1 データ型とオブジェクト . . . . . . . . . . . . . . . . . . . 25

    2.1.1 データ型 . . . . . . . . . . . . . . . . . . . . . . . 252.1.2 オブジェクト . . . . . . . . . . . . . . . . . . . . . 25

  • v

    2.2 変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.2.1 代入 . . . . . . . . . . . . . . . . . . . . . . . . . . 272.2.2 変数名 . . . . . . . . . . . . . . . . . . . . . . . . 27

    2.3 数値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.3.1 整数 . . . . . . . . . . . . . . . . . . . . . . . . . . 292.3.2 浮動小数点数 . . . . . . . . . . . . . . . . . . . . . 312.3.3 10 進固定及び浮動小数点数 . . . . . . . . . . . . . 342.3.4 複素数 . . . . . . . . . . . . . . . . . . . . . . . . 36

    2.4 算術演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . 382.5 文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

    2.5.1 文字列の作成 . . . . . . . . . . . . . . . . . . . . . 432.5.2 文字列の連結、繰り返し . . . . . . . . . . . . . . . 452.5.3 文字列の分割、結合 . . . . . . . . . . . . . . . . . 452.5.4 添字による要素の参照 . . . . . . . . . . . . . . . . 462.5.5 スライスによる要素の参照 . . . . . . . . . . . . . . 472.5.6 その他の文字列操作 . . . . . . . . . . . . . . . . . 492.5.7 書式指定 . . . . . . . . . . . . . . . . . . . . . . . 492.5.8 エンコード、デコード . . . . . . . . . . . . . . . . 51

    2.6 リスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532.6.1 リストの作成 . . . . . . . . . . . . . . . . . . . . . 532.6.2 要素の参照 . . . . . . . . . . . . . . . . . . . . . . 542.6.3 リストの操作 . . . . . . . . . . . . . . . . . . . . . 55

    2.7 タプル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582.7.1 タプルの作成 . . . . . . . . . . . . . . . . . . . . . 582.7.2 タプルの操作 . . . . . . . . . . . . . . . . . . . . . 59

    2.8 辞書 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602.8.1 辞書の作成 . . . . . . . . . . . . . . . . . . . . . . 612.8.2 辞書の操作 . . . . . . . . . . . . . . . . . . . . . . 62

    2.9 集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642.9.1 集合の作成 . . . . . . . . . . . . . . . . . . . . . . 64

  • vi 目次

    2.9.2 集合の演算 . . . . . . . . . . . . . . . . . . . . . . 652.10 その他の演算子 . . . . . . . . . . . . . . . . . . . . . . . . 67

    2.10.1 比較演算子 . . . . . . . . . . . . . . . . . . . . . . 672.10.2 論理演算子 . . . . . . . . . . . . . . . . . . . . . . 692.10.3 ビット演算子 . . . . . . . . . . . . . . . . . . . . . 702.10.4 シフト演算子 . . . . . . . . . . . . . . . . . . . . . 71

    2.11 条件分岐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722.12 反復処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    2.12.1 while 文 . . . . . . . . . . . . . . . . . . . . . . . . 732.12.2 for 文 . . . . . . . . . . . . . . . . . . . . . . . . . 76

    2.13 内包表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792.13.1 リスト内包表記 . . . . . . . . . . . . . . . . . . . . 792.13.2 辞書内包表記 . . . . . . . . . . . . . . . . . . . . . 802.13.3 集合内包表記 . . . . . . . . . . . . . . . . . . . . . 812.13.4 ジェネレータ内包表記 . . . . . . . . . . . . . . . . 81

    2.14 関数定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822.14.1 基本手順 . . . . . . . . . . . . . . . . . . . . . . . 822.14.2 可変長引数 . . . . . . . . . . . . . . . . . . . . . . 862.14.3 キーワード引数の辞書化 . . . . . . . . . . . . . . . 872.14.4 ドキュメンテーション文字列 . . . . . . . . . . . . . 872.14.5 関数のテクニック . . . . . . . . . . . . . . . . . . 88

    2.15 名前空間とスコープ . . . . . . . . . . . . . . . . . . . . . . 902.16 ジェネレータ . . . . . . . . . . . . . . . . . . . . . . . . . 912.17 デコレータ . . . . . . . . . . . . . . . . . . . . . . . . . . . 932.18 クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

    2.18.1 クラス定義 . . . . . . . . . . . . . . . . . . . . . . 952.18.2 継承 . . . . . . . . . . . . . . . . . . . . . . . . . . 992.18.3 親のメソッドの呼び出し . . . . . . . . . . . . . . . 1002.18.4 プロパティ . . . . . . . . . . . . . . . . . . . . . . 1012.18.5 名前のマングリング . . . . . . . . . . . . . . . . . 103

  • vii

    2.18.6 クラスメソッド、静的メソッド . . . . . . . . . . . 1042.18.7 特殊メソッド . . . . . . . . . . . . . . . . . . . . . 106

    2.19 エラー処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1072.19.1 例外 . . . . . . . . . . . . . . . . . . . . . . . . . . 1072.19.2 例外処理 . . . . . . . . . . . . . . . . . . . . . . . 108

    第 3章 配列を用いる計算 1103.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1103.2 ドキュメントを読む . . . . . . . . . . . . . . . . . . . . . . 1103.3 配列の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

    3.3.1 リストからの作成方法 . . . . . . . . . . . . . . . . 1123.3.2 配列要素のデータ型 . . . . . . . . . . . . . . . . . 1143.3.3 一定値の配列 . . . . . . . . . . . . . . . . . . . . . 1173.3.4 等間隔の配列 . . . . . . . . . . . . . . . . . . . . . 1193.3.5 単位行列、対角行列、三角行列 . . . . . . . . . . . 1213.3.6 格子状の行列 . . . . . . . . . . . . . . . . . . . . . 1233.3.7 繰り返しパターンの行列 . . . . . . . . . . . . . . . 1253.3.8 乱数配列 . . . . . . . . . . . . . . . . . . . . . . . 1263.3.9 その他 . . . . . . . . . . . . . . . . . . . . . . . . 129

    3.4 要素の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1303.4.1 インデックス、スライス . . . . . . . . . . . . . . . 1303.4.2 ビュー . . . . . . . . . . . . . . . . . . . . . . . . 1323.4.3 ファンシーインデックス参照 . . . . . . . . . . . . . 1343.4.4 ブールインデックス参照 . . . . . . . . . . . . . . . 135

    3.5 形状や大きさの変更 . . . . . . . . . . . . . . . . . . . . . . 1363.5.1 形状変更 . . . . . . . . . . . . . . . . . . . . . . . 1373.5.2 配列の結合 . . . . . . . . . . . . . . . . . . . . . . 1383.5.3 要素や軸の並べ替え . . . . . . . . . . . . . . . . . 140

    3.6 配列の基本演算 . . . . . . . . . . . . . . . . . . . . . . . . 1413.6.1 算術演算 . . . . . . . . . . . . . . . . . . . . . . . 1413.6.2 ユニバーサル関数 . . . . . . . . . . . . . . . . . . 145

  • viii 目次

    3.6.3 真偽値の配列、条件式 . . . . . . . . . . . . . . . . 1483.6.4 統計関数 . . . . . . . . . . . . . . . . . . . . . . . 151

    3.7 ベクトルや行列の演算 . . . . . . . . . . . . . . . . . . . . . 1543.7.1 積 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1543.7.2 行列クラス . . . . . . . . . . . . . . . . . . . . . . 162

    第 4章 記号計算 1644.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1644.2 記号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

    4.2.1 定義 . . . . . . . . . . . . . . . . . . . . . . . . . . 1654.2.2 定数と特殊シンボル . . . . . . . . . . . . . . . . . 1684.2.3 整数 . . . . . . . . . . . . . . . . . . . . . . . . . . 1694.2.4 浮動小数点数 . . . . . . . . . . . . . . . . . . . . . 1704.2.5 分数 . . . . . . . . . . . . . . . . . . . . . . . . . . 1714.2.6 関数 . . . . . . . . . . . . . . . . . . . . . . . . . . 172

    4.3 数式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1744.4 数式の操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

    4.4.1 単純化 . . . . . . . . . . . . . . . . . . . . . . . . 1764.4.2 多項式の変形 . . . . . . . . . . . . . . . . . . . . . 1784.4.3 分数の変形 . . . . . . . . . . . . . . . . . . . . . . 1804.4.4 記号への代入 . . . . . . . . . . . . . . . . . . . . . 181

    4.5 数値評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1824.6 微積分学 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

    4.6.1 微分 . . . . . . . . . . . . . . . . . . . . . . . . . . 1834.6.2 積分 . . . . . . . . . . . . . . . . . . . . . . . . . . 1854.6.3 極限 . . . . . . . . . . . . . . . . . . . . . . . . . . 1884.6.4 総和、総乗 . . . . . . . . . . . . . . . . . . . . . . 1894.6.5 級数展開 . . . . . . . . . . . . . . . . . . . . . . . 191

    4.7 方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1934.8 行列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

  • ix

    第 5章 データの可視化 1985.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

    5.1.1 バックエンド . . . . . . . . . . . . . . . . . . . . . 1995.2 グラフ描画の基礎 . . . . . . . . . . . . . . . . . . . . . . . 202

    5.2.1 基本的な 2 次元グラフ . . . . . . . . . . . . . . . . 2035.2.2 グラフの種類 . . . . . . . . . . . . . . . . . . . . . 2085.2.3 グラフの表示スタイル . . . . . . . . . . . . . . . . 209

    5.3 複数の図 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2115.3.1 挿入図 . . . . . . . . . . . . . . . . . . . . . . . . 2115.3.2 グラフを並べる . . . . . . . . . . . . . . . . . . . . 2145.3.3 2 軸グラフ . . . . . . . . . . . . . . . . . . . . . . 2165.3.4 配置のカスタマイズ . . . . . . . . . . . . . . . . . 218

    5.4 線やマーカーのスタイル . . . . . . . . . . . . . . . . . . . 2205.4.1 線の色、線種、線幅 . . . . . . . . . . . . . . . . . 2215.4.2 マーカー . . . . . . . . . . . . . . . . . . . . . . . 223

    5.5 文字による説明 . . . . . . . . . . . . . . . . . . . . . . . . 2255.5.1 テキストの書式 . . . . . . . . . . . . . . . . . . . . 2255.5.2 軸ラベルとタイトル . . . . . . . . . . . . . . . . . 2275.5.3 凡例 . . . . . . . . . . . . . . . . . . . . . . . . . . 229

    5.6 軸の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2315.6.1 目盛り . . . . . . . . . . . . . . . . . . . . . . . . 2315.6.2 対数グラフ . . . . . . . . . . . . . . . . . . . . . . 2365.6.3 格子線 . . . . . . . . . . . . . . . . . . . . . . . . 2375.6.4 スパイン . . . . . . . . . . . . . . . . . . . . . . . 2385.6.5 軸範囲 . . . . . . . . . . . . . . . . . . . . . . . . 240

    5.7 3 次元データの視覚化 . . . . . . . . . . . . . . . . . . . . . 2425.7.1 2 次元グラフ上での視覚化 . . . . . . . . . . . . . . 2425.7.2 3 次元グラフ . . . . . . . . . . . . . . . . . . . . . 244

    第 6章 数値計算への応用 2476.1 線形方程式系の解法 . . . . . . . . . . . . . . . . . . . . . . 247

  • x 目次

    6.1.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . 2486.1.2 線形方程式系 . . . . . . . . . . . . . . . . . . . . . 2486.1.3 正方系 . . . . . . . . . . . . . . . . . . . . . . . . 2496.1.4 優決定系 . . . . . . . . . . . . . . . . . . . . . . . 2556.1.5 劣決定系 . . . . . . . . . . . . . . . . . . . . . . . 2596.1.6 固有値問題 . . . . . . . . . . . . . . . . . . . . . . 259

    6.2 補間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2626.2.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . 2636.2.2 補間 . . . . . . . . . . . . . . . . . . . . . . . . . . 2636.2.3 多項式 . . . . . . . . . . . . . . . . . . . . . . . . 2646.2.4 多項式補間 . . . . . . . . . . . . . . . . . . . . . . 2676.2.5 スプライン補間 . . . . . . . . . . . . . . . . . . . . 271

    6.3 積分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2746.3.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . 2756.3.2 ニュートン・コーツ型の数値積分 . . . . . . . . . . 2756.3.3 ガウス型の数値積分 . . . . . . . . . . . . . . . . . 2796.3.4 多重積分 . . . . . . . . . . . . . . . . . . . . . . . 2816.3.5 任意精度の積分 . . . . . . . . . . . . . . . . . . . . 2856.3.6 積分変換 . . . . . . . . . . . . . . . . . . . . . . . 287

    第 7章 データ処理と分析 2917.1 Pandas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

    7.1.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . 2927.1.2 シリーズ . . . . . . . . . . . . . . . . . . . . . . . 2927.1.3 データフレーム . . . . . . . . . . . . . . . . . . . . 2957.1.4 時系列 . . . . . . . . . . . . . . . . . . . . . . . . 303

    7.2 Seaborn . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314

    第 8章 データの入出力 3178.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3178.2 CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318

  • xi

    8.3 HDF5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3228.3.1 ファイル内容の閲覧 . . . . . . . . . . . . . . . . . 3228.3.2 h5py . . . . . . . . . . . . . . . . . . . . . . . . . 3238.3.3 PyTables . . . . . . . . . . . . . . . . . . . . . . . 3318.3.4 Pandas HDFStore . . . . . . . . . . . . . . . . . . 335

    8.4 JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3378.5 Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340

    8.5.1 xlrd/xlwt . . . . . . . . . . . . . . . . . . . . . . . 3408.5.2 PyOpenXL . . . . . . . . . . . . . . . . . . . . . . 3438.5.3 XlsxWriter . . . . . . . . . . . . . . . . . . . . . . 3458.5.4 Pandas . . . . . . . . . . . . . . . . . . . . . . . . 347

    8.6 MAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348

    第 9章 コードの最適化 3509.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3519.2 Numba . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351

    9.2.1 numba.jit . . . . . . . . . . . . . . . . . . . . . . . 3529.2.2 numba.vectorize . . . . . . . . . . . . . . . . . . . 356

    9.3 Cython . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3589.3.1 基本的な使い方 . . . . . . . . . . . . . . . . . . . . 3589.3.2 型の宣言による高速化 . . . . . . . . . . . . . . . . 3629.3.3 外部 C コードとのインタフェース . . . . . . . . . . 365

    第 10章 他の言語との連携 36810.1 R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36810.2 Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37210.3 Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374

    参考文献 377

    索引 378

  • xii 図一覧

    図一覧

    1.5.1 Jupyter Notebookのダッシュボード画面 . . . . . . . . . . . . 201.5.2 新規に作成した Notebook . . . . . . . . . . . . . . . . . . . . 201.6.1 Spyder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    2.11.1 if文のフローチャート . . . . . . . . . . . . . . . . . . . . . . 722.12.1 while文のフローチャート . . . . . . . . . . . . . . . . . . . . 74

    4.3.1 数式のツリー構造 . . . . . . . . . . . . . . . . . . . . . . . . 175

    5.1.1 Matplotlibの GUI . . . . . . . . . . . . . . . . . . . . . . . . 2015.1.2 図のインライン表示 . . . . . . . . . . . . . . . . . . . . . . . 2025.2.1 Figure、Axesインスタンスの配置 . . . . . . . . . . . . . . . 2035.2.2 plotメソッドによる最も基本的なグラフ . . . . . . . . . . . 2055.2.3 savdfigメソッドによる図の保存の例 . . . . . . . . . . . . . 2075.2.4 グラフの重ね描き . . . . . . . . . . . . . . . . . . . . . . . . 2085.2.5 step, errorbar, fill, barメソッドの使用例 . . . . . . . . . 2095.2.6 ggplotスタイルの散布図 . . . . . . . . . . . . . . . . . . . . 2105.3.1 挿入図の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2125.3.2 拡大図の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2135.3.3 複数の図の配置 . . . . . . . . . . . . . . . . . . . . . . . . . 2165.3.4 2軸グラフの例 . . . . . . . . . . . . . . . . . . . . . . . . . . 2175.3.5 subplot2gridメソッドを使ったサブプロットの配置 . . . . . 2195.3.6 GridSpecインスタンスを使ったサブプロットの配置 . . . . . 2205.4.1 線の色、種類、幅の設定例 . . . . . . . . . . . . . . . . . . . 2235.4.2 マーカーの設定例 . . . . . . . . . . . . . . . . . . . . . . . . 2245.5.1 テキストラベルと注釈 . . . . . . . . . . . . . . . . . . . . . . 2275.5.2 軸のラベルとタイトルの設定例 . . . . . . . . . . . . . . . . . 2285.5.3 凡例の設定例 . . . . . . . . . . . . . . . . . . . . . . . . . . . 2305.5.4 グラフの外への凡例の配置 . . . . . . . . . . . . . . . . . . . 231

  • xiii

    5.6.1 主目盛りと補助目盛り . . . . . . . . . . . . . . . . . . . . . . 2325.6.2 mpl.tickerモジュールによる目盛りの設定例 . . . . . . . . 2335.6.3 主目盛りの配置とラベルの変更例 . . . . . . . . . . . . . . . 2345.6.4 科学的記数法による目盛りラベルの設定例 . . . . . . . . . . 2355.6.5 両対数グラフ . . . . . . . . . . . . . . . . . . . . . . . . . . . 2365.6.6 格子線の表示例 . . . . . . . . . . . . . . . . . . . . . . . . . 2385.6.7 スパインの設定例 . . . . . . . . . . . . . . . . . . . . . . . . 2395.6.8 軸範囲の設定例 . . . . . . . . . . . . . . . . . . . . . . . . . 2415.6.9 アスペクト比 1:1、2:1のグラフ . . . . . . . . . . . . . . . . 2425.7.1 pcolormesh, contourメソッドで作成したグラフの例 . . . . 2445.7.2 plot_surface, contourメソッドによる 3次元グラフの例 . . 246

    6.1.1 最小 2乗法による曲線当てはめ . . . . . . . . . . . . . . . . . 2576.2.1 累乗基底による多項式補間 . . . . . . . . . . . . . . . . . . . 2696.2.2 ルンゲ関数の多項式補間 . . . . . . . . . . . . . . . . . . . . 2706.2.3 ルンゲ関数の 3次スプライン補間 . . . . . . . . . . . . . . . 2736.2.4 2から 5次のスプライン補間 . . . . . . . . . . . . . . . . . . 2746.3.1 曲線と x軸の間の面積としての積分の概念図 . . . . . . . . . 2766.3.2 低次ニュートン・コーツ積分則の概念図 . . . . . . . . . . . . 277

    7.1.1 Series.plotメソッドによるグラフ作成の例 . . . . . . . . . 2957.1.2 地方別の平均寿命 (2010年度) . . . . . . . . . . . . . . . . . 3037.1.3 日経平均株価の高値と安値 . . . . . . . . . . . . . . . . . . . 3097.1.4 1月の日経平均株価の高値と安値 . . . . . . . . . . . . . . . . 3107.1.5 月平均の日経平均株価の高値と安値 . . . . . . . . . . . . . . 3127.1.6 日経平均株価の高値 (週平均、月平均) . . . . . . . . . . . . . 3147.2.1 Seabornによる作図 . . . . . . . . . . . . . . . . . . . . . . . 3157.2.2 カーネル密度推定 . . . . . . . . . . . . . . . . . . . . . . . . 316

    8.3.1 HDFView . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323

    9.2.1 ジュリア集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . 355

  • xiv 図一覧

    9.3.1 注釈付きの出力 . . . . . . . . . . . . . . . . . . . . . . . . . 361

    10.1.1 Rで作成した散布図 . . . . . . . . . . . . . . . . . . . . . . . 371

  • xv

    表一覧

    1.5.1 コマンドモードのキーボードショートカットの一例 . . . . . . 21

    2.3.1 float_info属性で調べられる浮動小数点数に関する情報 . . 332.3.2 rounding属性で指定できる Decimal型の数値の丸め方 . . . 352.4.1 算術演算子の優先順位 (高→低) . . . . . . . . . . . . . . . . . 412.5.1 書式指定の変換形式 . . . . . . . . . . . . . . . . . . . . . . . 502.10.1 比較演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    3.5.1 配列操作関数 (メソッド) . . . . . . . . . . . . . . . . . . . . 1403.5.2 配列の要素の並べ替え関数 (メソッド) . . . . . . . . . . . . . 1403.6.1 三角関数・双曲線関数の ufunc . . . . . . . . . . . . . . . . . 1453.6.2 指数関数・対数関数の ufunc . . . . . . . . . . . . . . . . . . 1463.6.3 その他の ufunc . . . . . . . . . . . . . . . . . . . . . . . . . . 1463.6.4 NumPyの論理演算の関数 . . . . . . . . . . . . . . . . . . . . 1493.6.5 NumPyの条件式の関数 . . . . . . . . . . . . . . . . . . . . . 1503.6.6 配列の基本統計関数 (メソッド) . . . . . . . . . . . . . . . . . 1523.7.1 ベクトルや行列の乗法の関数 (メソッド) . . . . . . . . . . . . 155

    4.2.1 sy.symbols関数のキーワード引数の一例 . . . . . . . . . . . 1674.2.2 SymPyの定数と特殊記号の一例 . . . . . . . . . . . . . . . . 1684.4.1 数式を単純化する関数 (メソッド) . . . . . . . . . . . . . . . 1774.8.1 SymPyの行列を操作する関数 (メソッド)の一例 . . . . . . . 197

    5.2.1 plt.figure関数のキーワード引数 . . . . . . . . . . . . . . . 2045.2.2 add_axesメソッドのキーワード引数の一例 . . . . . . . . . . 2045.2.3 savefigメソッドのキーワード引数 . . . . . . . . . . . . . . 2065.2.4 2次元作図メソッドの一例 . . . . . . . . . . . . . . . . . . . 2095.3.1 subplotsメソッドのキーワード引数 . . . . . . . . . . . . . 2145.3.2 subplots_adjustメソッドのキーワード引数 . . . . . . . . . 215

  • xvi 表一覧

    5.4.1 線とマーカーのオプション . . . . . . . . . . . . . . . . . . . 2215.4.2 色のオプション . . . . . . . . . . . . . . . . . . . . . . . . . 2215.4.3 線種のオプション . . . . . . . . . . . . . . . . . . . . . . . . 2225.4.4 マーカーのスタイル . . . . . . . . . . . . . . . . . . . . . . 2235.5.1 テキストのスタイルを設定するキーワード引数 . . . . . . . . 2265.5.2 legendメソッドの loc引数の値 . . . . . . . . . . . . . . . . 2295.6.1 axisメソッドで選択できる軸の設定 . . . . . . . . . . . . . . 240

    7.1.1 Seriesオブジェクトの統計メソッドの一例 . . . . . . . . . . 2947.1.2 read_csvメソッドのキーワード引数の一例 . . . . . . . . . . 298

    8.3.1 mode引数で指定できるモード . . . . . . . . . . . . . . . . . 324

  • 1

    第1章導入

    Pythonは科学技術計算に限らず、広い分野で使用されている高レベルな汎用プログラミング言語です。汎用言語として設計された言語ですが、その特性の多くが科学技術計算用途に

    も適しています。

    Pythonの主な特徴には次のようなものが挙げられます。

    • フリーのオーブンソースソフトウェアで、Python licenseに従って商業目的でも利用可能

    • Windows環境、Unix環境などマルチプラットフォームに対応• 記述された命令を逐次的に実行する手続型言語• オブジェクト指向でコードを記述可能• データの型をプログラムの実行時に動的に決定する動的型システム• コンパイルの手間が不要なインタープリタ動作• 簡潔で読みやすい構文• 手軽に他のプログラミング言語のライブラリを利用できる高い拡張性• 高機能で使いやすい数学・科学計算用ライブラリが充実 ※ 1

    • データ可視化ライブラリで簡単に出版品質のグラフを作成可能• 配列計算や拡張モジュールなどによる十分に高い実行速度• Jupyter Notebookによるコードを含むドキュメントの共有• 活発なユーザーコミュニティ ※ 2

    1.1 Python 環境の導入まずは Pythonをインストールし、科学技術計算向けの開発環境を整えましょう。Pythonは本体の他に、必要に応じて様々なライブラリをインストールする必要があります。Pythonでは pip※ 3 というコマンドで Python Package Index(PyPI)※ 4 上にある Pythonライブラリ

    ※ 1 科学技術計算用のライブラリの一例は Python 公式 Wiki のページ https://wiki.python.org/moin/NumericAndScientificにまとめられています。

    ※ 2 http://www.python.jp/community/※ 3 https://pip.pypa.io/en/stable/※ 4 https://pypi.python.org/pypi

    https://wiki.python.org/moin/NumericAndScientifichttps://wiki.python.org/moin/NumericAndScientifichttp://www.python.jp/community/https://pip.pypa.io/en/stable/https://pypi.python.org/pypi

  • 2 1.1 Python環境の導入

    をインストールできます。

    しかし、多くの科学技術計算向けの Python ライブラリは、C や Fortran などの他の言語のライブラリに依存しています。pipではこのような依存ライブラリはインストールできな

    いので、ユーザーが手動で依存ライブラリをインストールする必要があります。よって、科

    学技術計算向けの開発環境を構築するのは非常に手間な作業です。これを解決するために、

    Python 本体と科学技術計算向けの様々なライブラリをまとめた Python ディストリビューションが多数公開されています。Pythonの開発環境構築には、これらを使うことを強くおすすめします。

    このようなディストリビューションの代表的なものには、pipよりも優れたクロスプラッ

    トフォームインストーラである condaが使えるAnaconda※ 5や、Windows環境向けでインストール不要のポータブル環境として使えるWinPython※ 6 などがあります。また、Anacondaの最小構成の Miniconda※ 7 というディストリビューションもあります。これは必要なライブラリだけをインストールした環境を作りたい場合に便利です。本書では Anacondaの使用を前提に解説します。

    Anacondaでインストールされる IPythonコンソール、Jupyter Notebook、Spyder(IDE)を使えば、対話的に Pythonのコードを記述・実行できます。これらの使用方法については後の節で説明します。

    それでは、公式ページから自分が使っているプラットフォーム用のインストーラをダウン

    ロードし、Anacondaをインストールしてください ※ 8。また、本書では Python 3を対象に解説するので、インストーラは Python 3用のものを選択してください。なお、本書の執筆においては Anaconda 4.1.1を使用しています。Unix環境ではインストール後に .bashrcファイルなどに PATHを追加しておきましょう。

    1.1.1 環境の構築Anacondaのインストールが完了したら、仮想的な Pythonの実行環境を作成しましょう。

    conda createコマンドにより、システムの環境から独立した仮想環境を任意の数だけ作成

    可能です。これにより、プロジェクトごとに Pythonやパッケージのバージョンを管理でき、非常に便利です。

    ※ 5 https://www.continuum.io/downloads※ 6 http://winpython.github.io/※ 7 http://conda.pydata.org/miniconda.html※ 8 pyenv (https://github.com/yyuu/pyenv)という Python環境の管理ツールでもインストールできます。

    https://www.continuum.io/downloadshttp://winpython.github.io/http://conda.pydata.org/miniconda.htmlhttps://github.com/yyuu/pyenv

  • 1.1.1 環境の構築 3

    新しい仮想環境を作成するために、LinuxやMac OS Xなどの Unix環境ではターミナルから、Windows環境ではスタートメニューのAnacondaメニューグループから選べるAnacondaCommand Prompt から次のコマンドを実行します。なお、本書ではターミナルで入力するコードは先頭に $記号を記述して表しています。

    $ conda create -n py35 python=3.5 anaconda

    作成する仮想環境の名前は任意に決められるので、ここでは py35としました。python=3.5

    は使用する Pythonのバージョンで、本書執筆時点での最新バージョンの 3.5としています。最後の anacondaは Anacondaの用意しているパッケージを全て含めるという意味です ※ 9。利用できる仮想環境の一覧は次のコマンドで確認できます。

    $ conda info --envs

    Using Anaconda Cloud api site https://api.anaconda.org

    # conda environments:

    #

    py35 /home/kakuaky/anaconda3/envs/py35

    root * /home/kakuaky/anaconda3

    仮想環境が作成できたら、次のコマンドで作成した環境を有効化します。

    • Unix環境

    $ source activate py35

    • Windows環境

    $ activate py35

    仮想環境が有効化されたら次のコマンドを実行し、本書で使用する追加のパッケージをイ

    ンストールしておいてください。

    (py35)$ conda install pylint seaborn

    仮想環境にインストールしたライブラリの一覧は conda listコマンドで調べられます。

    ※ 9 Anacondaでインストールできるパッケージの一覧は公式ページ https://docs.continuum.io/anaconda/pkg-docsを参照してください。

    https://docs.continuum.io/anaconda/pkg-docshttps://docs.continuum.io/anaconda/pkg-docs

  • 4 1.1 Python環境の導入

    (py35)$ conda list

    # packages in environment at /home/kakuaky/anaconda3/envs/py35:

    #

    _nb_ext_conf 0.3.0 py35_0

    alabaster 0.7.8 py35_0

    anaconda-client 1.5.1 py35_0

    anaconda custom py35_0

    anaconda-navigator 1.2.3 py35_0

    ...

    作業が終わって仮想環境を無効化するには、次のコマンドを入力します。

    • Unix環境

    (py35)$ source deactivate

    • Windows環境

    (py35)$ deactivate

    環境が不要になった場合は、次のコマンドで環境を削除できます。

    $ conda remove -n py35 --all

    また、Anacondaにインストールされているライブラリは conda updateコマンドで更新できます。全てのライブラリを更新するには、次のコマンドを入力します。

    $ conda update --all

    condaコマンド自身の更新や、

    $ conda update conda

    Anacondaの更新も可能です。

    $ conda update anaconda

    この他にも conda コマンドには様々な機能があります。詳しくは公式ドキュメント ※ 10

    を参照してください。

    Anaconda をアンイントールしたい場合は、Unix 環境では以下ようにインストール先の

    ※ 10 http://conda.pydata.org/docs/using/index.html

    http://conda.pydata.org/docs/using/index.html

  • 5

    ディレクトリを削除します。

    $ rm -rf ~/anaconda3

    Windows環境では一般的なアプリのアンインストール方法でアンインストールできます。

    1.2 Python インタープリタUnix 環境ではターミナルで、Windows 環境では Anaconda Command Prompt で Pythonを起動できます。インストールされている Pythonのバージョンは次のコマンドで確認できます。

    $ python --version

    Python 3.5.2 :: Anaconda custom (64-bit)

    本書ではバージョン 3.5以降の Pythonを対象に解説します。それ以前のバージョン、特にPython 2系列とは大きく異なる部分があるので注意してください。

    Pythonのコード (ソースコード、スクリプト)を記述したソースファイルを pythonコマンドの引数に渡せば、Pythonのコードが実行されます。まずはテキストエディタで次のコードを記述し、hello.pyという名前でファイルを保存してください。

    プログラム 1.2.1: hello.py

    1 print('Hello world!')

    Pythonにこのファイル (ファイルのパス)を指定するとプログラムが実行され、

    $ python hello.py

    次のような結果が出力されます。

    Hello world!

    コードのテキストは、デフォルトでは UTF-8形式で記述された文字列として実行されます。UTF-8以外の形式でコードを記述している場合は、ファイルの先頭行に # -*- coding:エンコーディング名 -*-という書式でエンコーディングを指定できます。例えば、Windowsで使われることがある ShiftJIS に設定するには、# -*- coding: ShiftJIS -*- と記述します。

  • 6 1.3 IPythonコンソール

    Pythonインタープリタは対話型コンソール (いわゆる REPL: Read-eval-print loop)としても使えます。pythonとだけ入力して実行すれば Pythonインタープリタが対話モードで起動します。

    $ python

    Python 3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 2 2016, 17:53:06)

    [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux

    Type "help", "copyright", "credits" or "license" for more information.

    >>>

    >>>のあとにコードを入力して Enterキーを押すと、コードの評価と結果の出力が行われ、また次のコードの入力待ち状態になります。

    1.3 IPython コンソールIPython※ 11 は Pythonインタープリタを強力に拡張したコマンドライン REPL環境です。対話環境には IPythonを使用することをおすすめします。本節では IPythonの概要を説明します。

    ipythonコマンドを実行すると、IPythonのコマンドプロンプトが起動します。

    $ ipython

    Python 3.5.2 |Anaconda custom (64-bit)| (default, Jul 2 2016, 17:53:06)

    Type "copyright", "credits" or "license" for more information.

    IPython 5.1.0 -- An enhanced Interactive Python.

    ? -> Introduction and overview of IPython's features.

    %quickref -> Quick reference.

    help -> Python's own help system.

    object? -> Details about 'object', use 'object??' for extra details.

    In [1]:

    また、次のコマンドを実行すると、より高性能な GUIコンソールである Qtコンソールを起動できます ※ 12。

    ※ 11 https://ipython.org/※ 12 http://jupyter.org/qtconsole/stable/

    https://ipython.org/http://jupyter.org/qtconsole/stable/

  • 1.3.1 入出力 7

    $ jupyter qtconsole # または jupyter-qtconsole

    Qt コンソールは図のインライン表示や、タブを用いて一つのウィンドウ内に複数のコンソールを表示することなどが可能です。

    IPythonはターミナルから起動するコンソールだけでなく、後述する Jupyter NotebookやSpyder IDEでも使われています。IPythonはそれらのアプリケーションや、Qtコンソールで使用することをおすすめします。

    1.3.1 入出力IPythonコンソールのプロンプトは、入力には In [1]: 、出力には Out[1]: のように表示されます。[] (角括弧)の中の数字は新しい入出力のたびに増加していきます。これらの入力や出力を IPythonではセルと呼びます。Inと Outはそれぞれ Pythonのリストと辞書のオブジェクトであり、セルの履歴を格納しています。次のように入力セルにコードを入力して

    Enterキーを押すと、出力セルにコード評価の結果が出力されます。

    In [1]: 1 + 1

    Out[1]: 2

    In [2]: In[1]

    Out[2]: '1 + 1'

    In [3]: In

    Out[3]: ['', '1 + 1', 'In[1]', 'In']

    In [4]: Out

    Out[4]: {1: 2, 2: '1 + 1', 3: ['', '1 + 1', 'In[1]', 'In', 'Out']}

    変数の代入操作などでは、出力セルは表示されません。明示的に値を返さない関数は、結

    果に nullを表す Noneを返しており、このオブジェクトに対しては出力セルが表示されないようになっています。また、; (セミコロン)をステートメントの末尾に付けると、出力を抑制できます。

    In [5]: a = 10

    In [6]: None

  • 8 1.3 IPythonコンソール

    In [7]: 2**3;

    本書のサンプルコードではセルの履歴を使うことはないので、入力と出力のセルを次のよ

    うに略して表記することとします。

    In: 1 + 1

    2

    直近の評価結果は変数 _ (アンダースコア)に格納されています。また、その一つ前と二つ前の評価結果は変数 __ (ダブルアンダースコア)と ___ (トリプルアンダースコア)に格納されています。

    In: _

    2

    IPython コンソールでは () (括弧) などの中の記述途中に Enter キーを押すと、複数行に渡ってコードを記述できます。また、コードの行末に \ (バックスラッシュ)を置くと、任意の箇所で改行できます。本書のサンプルコードでは 2行目以降のコードのプロンプトは ...と表記することとします。

    In: print('Python',

    ... 'パイソン')

    Python パイソン

    In: 1 + 2 + \

    ... 3

    6

    なお、Qtコンソールでは Ctrl-Enter (Ctrlキーを押しながら Enterキーを押す)でコードの途中で改行が可能です。複数行に渡ってコードを入力した後は、Shift-Enter で実行できます。Qtコンソールのキーボードショートカットの一覧はメニューバーの Helpから確認できます。

    Pythonでもコードの意味の補足やメモを残すためのコメントを書けます。Pythonのコメントは # (シャープ)から行末までです。コメントは Pythonプログラムとしては無視されます。

    In: # 結果には何も表示されない

  • 1.3.2 入力補完 9

    In: 100 - 5 # ここの文字は無視される

    95

    複数行コメントは次のように書けます。

    In: # シャープの後は

    ... # コメントとして扱われる

    ...

    ... a = 1

    ...

    ... """

    ... 長いコメント文はこのようにも書ける

    ... """

    ...

    ... b = 2

    IPythonコンソールは Ctrl-Dで終了、Ctrl-Zで強制終了させられます。

    1.3.2 入力補完IPythonでは入力補完が使えます。入力補完とは、シンボル (変数名、関数名、クラス名など)の途中まで入力した状態で TABキーを押すことで、後に続く部分を補ってくれる機能です。例えば、flまで入力した後に TABキーを押すと floatと補完されます。fの後で補完させようとしても一意的には決まらず、次のように候補が表示されます。さらに TABキーを押すことで補完候補を選択できます。

    In: f

    %%file finally for frozenset float format filter from

    IPythonの補完入力は文脈で候補を判断するので、float.の後で TABキーを押すと、クラスの属性とメソッドが候補に表示されます。

    In: float.

    float.as_integer_ratio float.hex float.real float.conjugate

    float.imag float.fromhex float.is_integer

    IPython 5.0.0からは補完候補がポップアップ表示されるようになり、見やすくなりました。

  • 10 1.3 IPythonコンソール

    1.3.3 シェルコマンドの呼び出しIPythonでは Unix環境のシェルコマンドや、Windows環境の DOSコマンドを呼び出せます。これらのコマンドを呼び出すには、コマンドの前に感嘆符 (!)を付けます。例えば、Unix環境で使える lsコマンドでカレントディレクトリに存在するファイルの一覧を取得できま

    す。Windows環境なら同じことが dirコマンドでできます。

    In: !ls

    hello.py test.py

    In: fs = !ls

    In: fs

    ['hello.py', 'test.py']

    Pythonの変数の値をシェルコマンドに渡す場合には、変数名の前に $を付けます。

    In: f = 'hello.py'

    In: !cat -n $f

    1 print('Hello world!')

    1.3.4 マジックコマンドIPythonにはマジックコマンドという拡張コマンドが用意されています ※ 13。マジックコマンドは先頭に %記号が一つか二つ付いています。%記号が一つ付いているものは一行、二

    つ付いているものはセル (複数行)の範囲のコマンドです。マジックコマンドでよく使うものをいくつか紹介します。まず、%quickref コマンドで

    IPythonコンソールのクイックリファレンスを表示できます。

    In: %quickref

    セッションで定義されている変数や関数の一覧を %whoや %whosコマンドで調べられます。

    ※ 13 マジックコマンドの一覧は %lsmagic コマンドで参照できます。また、詳しい説明は公式ドキュメント

    http://ipython.readthedocs.org/en/stable/interactive/magics.htmlを参照してください。

    http://ipython.readthedocs.org/en/stable/interactive/magics.html

  • 1.3.5 プログラムの性能評価 11

    In: %who

    a

    In: %whos

    Variable Type Data/Info

    ----------------------------

    a int 10

    セッションで定義されている変数や関数をリセットするには %reset コマンドを使用し

    ます。

    In: %reset

    In: %who

    Interactive namespace is empty.

    IPythonから Pythonのソースファイルを実行するには %runコマンドを使用します。

    In: %run hello.py

    Hello world!

    1.3.5 プログラムの性能評価%timeと %timeitコマンドを使うと、Pythonコードの実行時間をおおまかに評価できます。%timeitコマンドは、コードを何度か実行し、実行時間を評価します。複数行のコード

    のセルを評価するには、代わりに %%timeitを使用します。コードの実行回数は自動的に設

    定されますが、-nや -rフラグを使用して設定できます。詳細は %timeit?コマンドを実行

    して参照してください。

    %timeitコマンドはコードの評価結果の値は返しません。評価結果も表示させたい場合は

    %timeコマンドを使用します。%timeコマンドはコードを一度だけ実行し、その結果と実行

    時間の測定結果を表示します。以下に %timeと %timeitコマンドの基本的な使用方法を示

    します。

    In: import numpy as np

    In: arr = np.random.randn(100000)

  • 12 1.3 IPythonコンソール

    In: %timeit np.sum(arr)

    10000 loops, best of 3: 37.6 µs per loop

    In: %time np.sum(arr)

    334.39367480487272

    In: %time np.sum(arr)

    CPU times: user 0 ns, sys: 0 ns, total: 0 ns

    Wall time: 222 µs

    In: %timeit -n 100 -r 5 np.sum(arr)

    100 loops, best of 5: 37.3 µs per loop

    Python にはガベージコレクションというメモリ管理機能があり、デフォルトではコードの評価が終わると余計なメモリが開放されます。%timeitコマンドでの繰り返し処理の際に

    は、一時的にガベージコレクションが無効になります。このため、繰り返し処理の際には 1回あたりの実行時間が短くなります。

    %time と %timeit コマンドは、コードのどこの部分で計算に時間がかかっているのかを

    調べられません。コードの実行時間を詳細に分析するには、Python の標準ライブラリのcProfile※ 14 を使用します。IPythonでは cProfileの機能を %prunコマンドで使用できます。また、%runコマンドに -pフラグを付けて実行すると、外部スクリプトファイルのプロファ

    イルを行えます ※ 15。

    例として、次の関数をプロファイル対象として %prunコマンドを実行してみます。

    In: def my_function(m, n):

    ... A = np.random.randn(n, n)

    ... x = [A @ np.random.randint(i+1, size=(n, 1)) for i in range(m)]

    ... return np.max(x)

    ※ 14 http://docs.python.jp/3/library/profile.html※ 15 IPythonから %run -p main.pyのように実行します。また、コンソールから python -m cProfile main.py

    として実行できます。

    http://docs.python.jp/3/library/profile.html

  • 1.3.6 デバッガ 13

    In: %prun my_function(100, 1000)

    109 function calls in 0.094 seconds

    Ordered by: internal time

    ncalls tottime percall cumtime percall filename:lineno(function)

    1 0.049 0.049 0.050 0.050 main.org[*Org Src main.org[ ipython

    ]*]:3()↪

    1 0.044 0.044 0.044 0.044 {method 'randn' of

    'mtrand.RandomState' objects}↪

    100 0.002 0.000 0.002 0.000 {method 'randint' of

    'mtrand.RandomState' objects}↪

    1 0.000 0.000 0.000 0.000 {method 'reduce' of 'numpy.ufunc'

    objects}↪

    1 0.000 0.000 0.094 0.094 main.org[*Org Src main.org[ ipython

    ]*]:1(my_function)↪

    1 0.000 0.000 0.094 0.094 {built-in method builtins.exec}

    1 0.000 0.000 0.094 0.094 :1()

    1 0.000 0.000 0.000 0.000 fromnumeric.py:2175(amax)

    1 0.000 0.000 0.000 0.000 _methods.py:25(_amax)

    1 0.000 0.000 0.000 0.000 {method 'disable' of

    '_lsprof.Profiler' objects}↪

    出力されるレポートには、各関数が呼び出された回数、実行時間の合計と累積、呼び出し

    1回当たりの実行時間がまとめられています。

    1.3.6 デバッガIPythonには便利なデバッガモードが用意されています。デバッガはコードの実行中にエラーが発生したとき、エラーの発生源を調べて、問題解決を助けるものです。IPythonではエラーが発生するとスタックトレースの結果が出力されます。その後に %debugコマンドを

    実行すると、Pythonのデバッガに直接移れます。例として、次のような関数を定義してみます。

    In: def h(x):

    ... return 2 / x

  • 14 1.3 IPythonコンソール

    In: def g(x):

    ... y = 4

    ... return y * h(x)

    In: def f(x):

    ... return 1 + g(x)

    関数 fが gを呼び、gが hを呼ぶ依存関係になっています。次のコードを実行し、わざと

    エラーを発生させてみます。

    In: f(0)

    ---------------------------------------------------------------------------

    ZeroDivisionError Traceback (most recent call last)

    in ()

    ----> 1 f(0)

    in f(x)

    1 def f(x):

    ----> 2 return 1 + g(x)

    3

    in g(x)

    1 def g(x):

    2 y = 4

    ----> 3 return y * h(x)

    4

    in h(x)

    1 def h(x):

    ----> 2 return 2 / x

    3

    ZeroDivisionError: division by zero

    すると、狙いとおりエラーが発生し、スタックトレースの結果が表示されます。この結果

    から、どのような経由、どこの部分、そして何のエラーが発生しているのかがわかります。

    エラーの後に %debugコマンドを実行するとデバッガが起動し、エラーが発生する直前の

    箇所でデバッガのプロンプトに移ります。

  • 15

    In: %debug

    > (2)h()

    1 def h(x):

    ----> 2 return 2 / x

    3

    ipdb>

    ipdb>プロンプトから変数の状態を調べたり、Pythonのデバッガ pdb※ 16 のコマンドでステップ実行など、様々なデバッグ機能を使用できます。

    ipdb> print(x)

    0

    ipdb> ?

    Documented commands (type help ):

    ========================================

    EOF c d h next pp retval u whatis

    a cl debug help p psource run unalias where

    alias clear disable ignore pdef q rv undisplay

    args commands display interact pdoc quit s unt

    b condition down j pfile r source until

    break cont enable jump pinfo restart step up

    bt continue exit n pinfo2 return tbreak w

    Miscellaneous help topics:

    ==========================

    pdb exec

    Undocumented commands:

    ======================

    l list ll longlist

    ※ 16 http://docs.python.jp/3/library/pdb.html

    http://docs.python.jp/3/library/pdb.html

  • 16 1.4 モジュールの利用

    1.4 モジュールの利用モジュールとは、Pythonのコードをまとめたファイルのことです。いろんなプログラムに共通で使えるようなコードを別ファイルにまとめておき、必要になったらそれを参照するよ

    うにすれば、コードの流用性が高まります。

    Pythonをインストールすると、たくさんのモジュールやパッケージ (複数のモジュールをまとめたもの)も一緒にインストールされます。この Pythonに標準で組込まれているモジュールやパッケージは標準ライブラリと呼ばれています ※ 17。また、AnacondaやWinPythonには科学技術計算向けの様々なサードパーティ製ライブラリが同梱されています。

    1.4.1 インポートモジュールのインポートは import モジュール名の書式で記述します。モジュール名は

    ファイル名から .pyを除いたものです。

    In: import math

    In: math.exp(2)

    7.38905609893065

    , (カンマ)でモジュール名を区切って並べれば、複数のモジュールを一度にインポートすることも可能です。

    In: import math, fractions

    In: fractions.Fraction(math.pi).limit_denominator(1000)

    Fraction(355, 113)

    as 文を使うと、モジュール名に別名を与えてインポートできます。モジュール名が長い

    ため簡潔な名前にしたい場合や、同名のモジュールをインポートしたい場合に使います。名

    前はユーザーの自由に設定できますが、モジュールによっては慣習的に使われる名前があり

    (例: import numpy as np)、その場合はそれに合わせるようにしましょう。

    In: import random as r

    ※ 17 標準ライブラリについては公式ドキュメント http://docs.python.jp/3/library/index.htmlを参照し

    てください。Pythonで何かやりたいことがあったときは、まずは標準モジュールで実現できないか調べてみましょう。

    http://docs.python.jp/3/library/index.html

  • 1.4.1 インポート 17

    In: r.randint(0, 10)

    6

    モジュールの中から必要なものだけインポートしたい場合は、from文を使います。

    In: from math import pi, cos

    In: cos(pi)

    -1.0

    from文を使ったインポート方法では、* (アスタリスク)を使ってモジュールで定義されている全ての変数や関数などをインポートできます。しかし、これは既にセッションで定義し

    た同名の変数などを上書きする危険があるので、使うとしても短いプログラムに限って使う

    ようにしましょう。

    In: from math import *

    In: log(10)

    2.302585092994046

    以上の三つの文は組み合わせて使えます。次のコードは fractions モジュールから

    Fractionクラスを fという名前でインポートしています。

    In: from fractions import Fraction as f

    In: a = f(1, 3) * f(1, 2)

    In: print(a)

    1/6

    Python には複数のモジュールをまとめて管理する、パッケージ という仕組みがあります。パッケージの実態は、モジュールとなるファイルを格納しているディレクトリです。モ

    ジュールが大規模になる場合は、複数モジュールからなるパッケージにした方が管理が楽に

    なります。パッケージのモジュールをインポートするには、パッケージ名.モジュール名と

    いうように階層構造を . (ドット)で区切って表記します。次のコードは、scipyパッケージの constantsモジュールから goldenという変数をインポートしています。

    In: from scipy.constants import golden

  • 18 1.5 Jupyter Notebook

    In: print(golden)

    1.618033988749895

    1.4.2 検索パスPythonはモジュールをインポートするとき、sysモジュールの pathに指定されたディレクトリを参照します。著者の環境では次のディレクトリに検索パスが設定されています。

    In: import sys

    In: sys.path

    ['',

    '/home/kakuaky/anaconda3/envs/py35/bin',

    '/home/kakuaky/anaconda3/envs/py35/lib/python35.zip',

    '/home/kakuaky/anaconda3/envs/py35/lib/python3.5',

    '/home/kakuaky/anaconda3/envs/py35/lib/python3.5/plat-linux',

    '/home/kakuaky/anaconda3/envs/py35/lib/python3.5/lib-dynload',

    '/home/kakuaky/anaconda3/envs/py35/lib/python3.5/site-packages',

    '/home/kakuaky/anaconda3/envs/py35/lib/python3.5/site-packages/Sphinx-1.4.1-p

    y3.5.egg',↪

    '/home/kakuaky/anaconda3/envs/py35/lib/python3.5/site-packages/setuptools-26.

    1.1-py3.5.egg',↪

    '/home/kakuaky/anaconda3/envs/py35/lib/python3.5/site-packages/IPython/extens

    ions',↪

    '/home/kakuaky/.ipython']

    最初の ''はプログラムを実行中のカレントディレクトリを表しています。Pythonはこのリストの上位からモジュールを探索するので、もしも同じ名前のモジュールが存在する場合、

    上位のディレクトリに含まれるモジュールしか使えません。

    環境変数 PYTHONPATH に検索対象のディレクトリを指定しておくと、sys.path の先頭に

    パスが追加されます。また、sys.path.appendメソッドで Pythonからも検索パスを追加できます。

  • 19

    1.5 Jupyter NotebookJupyter Notebook※ 18 は対話的コンピューティングのための Web アプリケーションです ※ 19。元々は IPython Notebookというツールでしたが、Python以外の言語のカーネルでも使用できるように拡張され、Jupyter Notebookという名前になりました。Jupyter Notebookは対話的コンソールのようにコードを実行し結果を表示できるだけでなく、それに説明用の

    テキスト、数式、画像、動画などを集約して一つのドキュメントとして統合します。また、

    IPythonのウィジェットシステムを使用して、HTMLや JavaScriptで GUI要素を作成することも可能です。できあがったドキュメントは HTMLや PDFなどにエクスポートできます。これにより、プログラミングは IDEで、文章作成はテキストエディタで作成などと分けることなく、一つの環境で作業に集中できます ※ 20。さらに、ドキュメントをスライド表示でき

    るため、ドキュメントをそのままプレゼンテーション用資料としても利用できます。IPythonカーネルはサーバ側で実行しておけばいいので、Notebookの共有が簡単なのも大きな利点です。

    Jupyter Notebookは公式ページから試せます。ページ中段の Ready to get started? にあるTry it in browserをクリックすると、いくつかサンプルを実行できます。また、自分の環境のJupyter Notebookを開始するには次のコマンドを実行します。

    $ jupyter notebook # または jupyter-notebook

    デフォルトではローカルホストのポート 8888でWebサーバが立ち上がり、Notebookカーネルと Web アプリケーションが起動します。そして、デフォルトの Web ブラウザにダッシュボードのWebページが開きます (図 1.5.1)。ダッシュボードには、Jupyter Notebookを実行したディレクトリから利用できるサブディレクトリとファイルが表示されます。ここか

    らファイルの操作などが可能です。また、Condaタグからは環境の作成や編集、ライブラリの管理ができます。

    ※ 18 公式ページ http://jupyter.org と公式ドキュメント http://jupyter.readthedocs.org/en/latest/

    index.htmlには一とおり目を通しておくとよいでしょう。特に、Notebookのサーバーを外部に公開したい場合はセキュリティの項目を熟読しましょう。

    ※ 19 使用しているブラウザで JavaScriptを無効にしていると実行できません。※ 20 高機能なテキストエディタには、コードの実行とその結果を文章に埋め込め機能があります。本書も Emacs

    (https://www.gnu.org/software/emacs/)の Org-babelというツールを用いて作成しました。

    http://jupyter.orghttp://jupyter.readthedocs.org/en/latest/index.htmlhttp://jupyter.readthedocs.org/en/latest/index.htmlhttps://www.gnu.org/software/emacs/