科学技術計算のためのPython入門
――開発基礎,必須ライブラリ,高速化

書籍の概要

この本の概要

科学技術計算向けの,Pythonの実践的な入門書。理工系の学部や研究室等でもPython採用実績が増えてきています。本書では,実験やシミュレーション等で役立つPythonによる開発の基本を徹底解説。冒頭でロケットシミュレータの作成場面を想定し,コーディングの基礎からデバッグやテストまで,いつ,何をするか,具体的なフローを平易に紹介します。押さえておきたいライブラリであるNumpy/SciPy/Matplotlib/pandas等もコンパクトな例と共に紹介。広く初学者の方々へ,言語の基本から実践テクニックまで一挙にわかる1冊です。

こんな方におすすめ

本書の想定読者は,これから科学技術計算やエンジニアリングにPythonを使い始めてみようと考えている方々で,たとえば以下のような方々です。

  • Pythonがどのような言語で何ができるのかを学びたい方
  • Pythonで科学技術計算を行ってみたい方
  • Pythonによるハイパフォーマンスプログラミングの基礎知識を学びたい方
  • Pythonの文法に加えて,実際的なプログラム構築法を学びたい方

本書では,言語の基本文法の解説を行うだけでなく,効率的に科学技術計算ができるスキルを身に付けていけるように構成しています。単に言語仕様を学ぶだけでなく,効率的なプログラム構築ができるようになりたいと考えている方々に最適です。

本書の構成

本書では,Pythonという言語の仕様や基本事項に加えて,研究や開発において,どのようにPythonを用いていくかに着目しながら解説を進めます。おもに理工系の学生やエンジニアの方々が,Pythonのエコシステムを活用しながら,研究や開発に効率的に取り組むための助けとなるように全体を構成しました。各章は,以下のような内容となっています。

第1章「科学技術計算とPython」では,Pythonという言語の特徴とプログラミング言語としての位置付けを,その利用状況に関する動向と共に解説します。なぜ今,Pythonの利用をお勧めするのか,そのワケを示します。

第2章「ゼロからのシミュレータ開発」では,ゼロからシミュレーションプログラムを構築し,そのプログラムを改善していく一連の作業を見ていきます。この工程を見ることで,効率的なプログラム構築に必要となる手順の全体像を学ぶことができます。

第3章「IPythonとSpyder」では,Pythonのインタラクティブシェルのスタンダードと言えるIPythonと,統合開発環境のSpyderについて説明します。これらの機能を使いこなすことで,みなさんの生産性は飛躍的に向上するでしょう。

第4章「Pythonの基礎」では,Pythonをはじめて学ぶ方のために,言語の基本ルールを説明します。さらに,第5章「クラスとオブジェクトの基礎」で,Pythonのオブジェクト指向について解説し,第6章「入力と出力」では,データの入出力方法について,全体像が掴めるように概説します。これらの3つの章を学ぶことで,Pythonによるプログラミングをスタートさせることができるようになるでしょう。

第7章から第10章では,科学技術計算に必須のライブラリである「NumPy」「SciPy」「Matplotlib」「pandas」について,その機能の概要を説明します。これらの最重要ライブラリを使いこなすことができれば,実現できる処理の幅がぐっと広がります。

第11章「プログラムの高速化」と第12章「プログラム高速化の応用例」では,プログラム高速化のための指針を示し,具体的なツールの利用例を紹介します。これらは,科学技術計算におけるPython上級プログラマへのステップアップにつながるでしょう。

この書籍に関連する記事があります!

Pythonでプログラミングを始めよう
「もしコンピュータ言語をひとつも知らないのなら,まずPythonを学ぶことを勧める」。

目次

本書について

謝辞

本書の構成

本書の想定読者について

動作確認に使用したOSとPythonのバージョン等について

本書のサポートページについて

第1章 科学技術計算とPython

1.1 データで見るPythonの今

  • Pythonの台頭
  • 教育用言語としてのPython
  • 日本におけるPythonの利用は?

1.2 Pythonの基礎知識

  • Pythonの開発経緯
  • Pythonの特徴

Column Pythonの誕生

  • ❶可読性とメンテナンス性
  • ❷インタープリタ言語
  • ❸スクリプト言語
  • ❹グルー言語
  • ❺バッテリー内蔵
  • ❻充実したエコシステム
  • パッケージ管理システム
  • Python 2系とPython 3系

Column Pythonのライセンス

1.3 科学技術計算とPythonの関わり

  • Pythonが科学技術計算で使われる理由
  • Pythonの普及度
  • 利用のしやすさ
  • なぜPythonを使うのか
  • SciPy Stack
  • 民間企業とコミュニティ
  • Pythonの活用事例
  • Pythonの実行速度は本当に遅いのか
  • 今回のベンチマークの詳細

Column スタックメモリとヒープメモリ

1.4 まとめ

第2章 ゼロからのシミュレータ開発

2.1 シミュレータを設計する

  • ロケットシミュレータ「PyRockSim」
  • 機能構成
  • プログラム構築の手順

2.2 機能分割とファイル分割

  • 機能分割
  • 機能実装上の留意点
  • ファイル分割とimport

2.3 コーディング

  • 処理の流れ
  • ライブラリのimport
  • ロケット諸元の設定
  • 状態量の設定と積分計算
  • メイン実行コード
  • 計算結果の確認

2.4 静的コード解析

  • 静的コード解析の目的
  • 静的コード解析用ツール

2.5 単体テスト

  • ソフトウェアのテスト
  • 単体テスト用のツール
  • doctest
  • unittest
  • nose

2.6 デバッグ

  • pdb
  • pdbが不要なデバッグ
  • pdbが必要なデバッグ

2.7 プログラムの最適化

  • まずはプロファイリング
  • 先人の成果を活用する
  • さらなる高速化へ

2.8 まとめ

第3章 IPythonとSpyder

3.1 IPython

  • IPythonとは
  • IPythonを使うには

Column Jupyter

  • Jupyter Notebook上での利用
  • IPythonの基本 入力と出力の関係から
  • オブジェクトの中身を確認する
  • 関数の内容表示
  • 関数の詳細な内容表示
  • オブジェクト名を検索する
  • マジックコマンド ラインマジック,セルマジック
  • OSとの連携
  • 履歴の利用 history
  • 履歴の検索
  • タブ補完
  • スクリプトファイルの実行
  • IPythonによるデバッグ デバッガpdb
  • 事後解析デバッギング
  • スクリプト指定でデバッガ起動
  • 指定の箇所でデバッガ起動
  • プロファイリング
  • 実行時間計測
  • プロファイリングの準備
  • 実行時間のプロファイリング
  • メモリ使用量のプロファイリング
  • メモリプロファイリング対象のソースコード内指定

3.2 Spyder

  • Spyderとは
  • Spyderの主要な機能
  • プログラムエディタ
  • プログラムの実行
  • Docstringやヘルプの表示 Object inspector
  • ワークスペース内の変数を表示 Variable explorer
  • データファイルの入出力
  • UMD Spyderの隠れた重要な機能

3.3 まとめ

第4章 Pythonの基礎

4.1 記述スタイル

  • スクリプトの記述ルール
  • エンコーディング
  • インデント
  • コメント
  • PEP
  • スクリプトの構成

4.2 オブジェクトと型

  • オブジェクト
  • 識別子

Column 予約済みの識別子

  • データ型(組み込みのデータ型) 重要な型の一覧から

Column イミュータブルとは何か? Pythonの実装はどのようにメモリを用いるか

  • 数値の型
  • 文字列型
  • リスト
  • タプル
  • バイトおよびバイト配列
  • 辞書型
  • 集合型
  • リテラル
  • 文字列リテラル
  • 文字列のエスケープシーケンス
  • 数値リテラル
  • コンテナ型のリテラル

4.3 シーケンス型の操作

  • インデキシング
  • スライシング
  • データ(値)の更新
  • リスト内包表記

4.4 集合型と辞書型の操作

  • 集合型の操作
  • 辞書型の操作

4.5 変数とデータ

  • 変数の新規作成 Pythonの場合
  • C言語の場合
  • 変数の再定義 Pythonの場合
  • C言語の場合
  • 参照の割り当て 基本的な参照割り当ての例から
  • 参照割り当て後の再定義
  • 2変数への同一リストの割り当て

4.6 浅いコピーと深いコピー

  • 浅いコピー
  • 複合オブジェクトでない場合
  • 複合オブジェクトの場合
  • 深いコピー

4.7 演算子と式評価

  • ブール値判定とブール演算
  • 比較演算子
  • 数値の型の演算
  • 整数のビット演算

4.8 フロー制御

  • if文
  • for文

Column スペース(空白文字)の使い方

  • while文
  • try文
  • with文

4.9 関数の定義

  • 関数定義の基本
  • オプションパラメータ
  • 可変長引数とキーワード引数
  • lambda式
  • ジェネレータ関数
  • デコレータ
  • 手続き型言語

4.10 モジュールとパッケージ

  • ライブラリ,モジュール,パッケージ
  • importの基本
  • パッケージのimport
  • ファイル検索の順番

4.11 名前空間とスコープ

  • 名前空間
  • スコープ
  • 関数におけるスコープと名前空間
  • 名前空間と変数操作
  • global文とスコープ拡張
  • nonlocalとスコープ拡張
  • クロージャ

4.12 まとめ

第5章 クラスとオブジェクトの基礎

5.1 クラス定義

  • 本章における解説項目について
  • クラス定義の基本形
  • クラス属性とインスタンス属性
  • コンストラクタとデストラクタ

5.2 継承

  • 基底クラスと派生クラス
  • 継承後の属性の再定義と新規追加

5.3 スタティックメソッドとクラスメソッド

  • スタティックメソッド
  • クラスメソッド

5.4 隠ぺいの方法

  • 情報隠ぺいとカプセル化
  • プライベートメンバの指定

5.5 クラスと名前空間

  • 名前空間とスコープの生成
  • クラス属性とインスタンス属性

5.6 まとめ

第6章 入力と出力

6.1 コンソール入出力

  • コンソール入力
  • コンソール出力

6.2 ファイル入出力の基本

  • open関数
  • open関数のモード
  • ファイルの読み込みとクローズ
  • ファイルへのデータ書き出し

6.3 データファイルの入出力

  • 入出力によく使われるデータ形式
  • CSVファイルの入出力
  • 標準モジュールcsv
  • NumPyのCSV読み込み用関数
  • Excelファイルの入出力
  • XLS形式の入出力
  • OOXML形式の入出力
  • pickleファイルの入出力
  • 単一変数のpickle化
  • 複数変数のpickle化
  • その他のバイナリファイルの入出力
  • NumPyのnpy/npz形式
  • HDF5形式
  • MAT-file形式

Column HDF5

6.4 pandasのデータ入出力機能

  • pandasのデータ入出力関数
  • データ形式と入出力速度
  • テキストデータの入出力
  • 読み込み処理の詳細

6.5 Web入力

  • urllibパッケージを用いたHTMLデータの読み出し
  • Python 2系とPython 3系のurllib関連情報

6.6 まとめ

Column 入力設定の試行錯誤

第7章 NumPy

7.1 NumPyとは

  • NumPyの機能全貌
  • NumPyの各種関数群
  • NumPyはなぜ速い?

Column 線形代数の数値演算ライブラリ

7.2 NumPyのデータ型

  • 細分化されたデータ型
  • NumPyの組み込みデータ型
  • NumPyのスカラー

7.3 多次元配列オブジェクトndarray

  • 配列と行列
  • ndarrayの生成
  • データ型の指定
  • ndarrayの属性
  • ndarrayのメソッド
  • ndarrayによる行列計算
  • ndarrayのインデキシング
  • 基本インデキシングによる参照
  • 応用インデキシングによる参照
  • ビューとコピー
  • データとメモリの関係

7.4 ユニバーサル関数

  • ユニバーサル関数「ufunc」の機能
  • Python関数のufunc化

7.5 ブロードキャスティング

  • ブロードキャスティングの仕組み
  • ブロードキャスティングの具体例
  • 次元に関する注意事項

7.6 まとめ

第8章 SciPy

8.1 SciPyとは

  • SciPyの概要
  • NumPyとの関係
  • 最適化で一歩先を行くSciPy
  • SciPyとNumPyの差を調べる

8.2 実践SciPy

  • 統計分布関数
  • 離散フーリエ解析

Column Pythonの統計処理

  • ボード線図
  • データの内挿
  • デジタル信号フィルタの設計
  • 行列の分解

8.3 まとめ

第9章 Matplotlib

9.1 Matplotlibとは

  • Matplotlibの概要
  • Matplotlibのモジュール
  • Matplotlibのツールキット
  • pylabとpyplotとNumPyの関係

9.2 Matplotlibの設定

  • 2つの設定方法
  • 設定の確認と,設定コマンドによる変更
  • 設定ファイルへの記述
  • スタイルシート
  • グラフに日本語を使う

9.3 実践Matplotlib

  • 基本の描画
  • サブプロット
  • 等高線図
  • 3次元プロット

Column カラーマップについて

9.4 その他の作図ツール

  • Matplotlib以外のおもな作図ツール

9.5 まとめ

第10章 pandas

10.1 pandasとは

  • pandasの概要
  • PyData
  • pandasで何ができる?

10.2 pandasのデータ型

  • 基本のデータ型
  • シリーズ
  • データフレーム
  • パネル

10.3 データの処理

  • pandasのAPI
  • NumPyとの連携機能 ユニバーサル関数,データ型の変換
  • 部分データを取り出す
  • 基本的な演算規則
  • 比較演算
  • 基礎的な統計関数
  • 関数の適用
  • NaNの処理
  • プロット機能
  • ビューとコピー

10.4 まとめ

第11章 プログラムの高速化

11.1 プログラムの高速化の基本

  • 高速化への4つのアプローチ

11.2 ボトルネックの解消

  • ボトルネックの解消
  • コーディング方法による高速化
  • 先入観を持たずに試してみる
  • 極力Pythonの組み込み関数や標準ライブラリを使う
  • ループ計算(for,while)を極力避ける
  • メモリ利用の効率化
  • メモリのマネジメント
  • ndarrayに関する省メモリ化
  • プロファイラの有効活用
  • IPythonを使わない関数プロファイリング
  • プロファイリング結果のグラフィカル表示
  • IPythonを使わないラインプロファイリング

11.3 処理の並列化

  • CPUの性能向上
  • GIL

Column Intel Xeon Phi

  • SIMD
  • IntelのSIMD拡張命令
  • PythonにおけるSIMD活用

Column Intel MKL

  • スレッドとマルチスレッド化
  • マルチスレッドのプログラム
  • 並行だが並列じゃない
  • マルチスレッド化による処理速度向上について
  • マルチプロセス利用

Column 注目を集めるGPU

  • マルチプロセス利用の利点
  • ProcessPoolExecutor

Column Blazeエコシステム

11.4 まとめ

第12章 プログラム高速化の応用例

12.1 高速ライブラリ(他言語)の活用

  • 他言語ライブラリのパッケージ
  • Cython Cythonは拡張言語
  • Cythonの機能
  • Cythonの使い方
  • Cythonコード作成からコンパイルまで
  • Cythonコードの実行時コンパイル
  • Cythonによる並列プログラミング例 NumPyプログラムのCythonコード化から
  • setupスクリプトの作成例
  • 高速化の効果検証
  • 自作のC/C++ライブラリの活用
  • 自作C/C++ライブラリのコンパイル
  • ライブラリのimport方法

12.2 JITコンパイラ利用

  • Numba

Column Julia

  • 基本的な使い方
  • どのようなプログラムに使えるか
  • Numbaのデコレータ
  • Numbaの利用例(@jitclass)
  • Numbaの利用例(ufunc作成)
  • Numbaの利用例(マルチスレッド化)
  • Numexpr

12.3 まとめ

Appendix

Appendix A 参考文献&学習リソース

Appendix B 組み込み関数と標準ライブラリ

Appendix C NumPyの関数リファレンス

著者プロフィール

中久喜健司(なかくきけんじ)

東京大学工学部航空宇宙工学科および同大学院を2000年に卒業後,三菱電機(株)に入社。空力/航法/制御系設計のエンジニアとしてさまざまな業務に従事し,今に至る。GPS(米国の衛星測位システム)の利用技術などに詳しい。測位航法学会正会員。研究/開発業務でC言語,MATLAB,Perlなどのプログラミング言語を利用しているが,Pythonのエコシステムの充実に伴い,Pythonの業務への利用/活用を進めている。