├── LICENSE.md ├── README.md ├── cover_image.png ├── error_table.txt └── src ├── chapter1 ├── c_bench1.c ├── filelist.txt └── py_bench1.py ├── chapter10 ├── filelist.txt └── pd_plt1.py ├── chapter11 ├── filelist.txt ├── for_listcomp.py ├── spd_multip2.py ├── spd_profile.py └── spd_profile2.py ├── chapter12 ├── cython_1.pyx ├── cython_2.pyx ├── cython_3.py ├── filelist.txt ├── myfunc_cdecl.c ├── myfunc_stdcall.c ├── py_c_api.c ├── setup_cy1.py ├── setup_cy2.py ├── spc_numba1.py ├── spd_numba2.py ├── spd_numba4.py └── spd_numexpr.py ├── chapter2 └── Readme.txt ├── chapter3 ├── fc.py ├── filelist.txt ├── myscript.py ├── prun1.py └── prun2.py ├── chapter4 ├── decorator_1.py ├── filelist.txt ├── module_1.py └── module_2.py ├── chapter5 ├── class1.py ├── class2.py ├── class3.py ├── classmethod1.py ├── filelist.txt ├── inheritance1.py ├── instance1.py ├── scope_error.py └── static1.py ├── chapter6 ├── csv_read1.py ├── csv_read2.py ├── data1.csv ├── excel_read1.py ├── filelist.txt ├── hdf5-1.py ├── matread1.py ├── npynpz1.py ├── openpyxl1.py ├── pickle1.py ├── pickle2.py └── pickle3.py ├── chapter7 └── filelist.txt ├── chapter8 ├── filelist.txt ├── plt_bode.py ├── plt_fft.py ├── plt_iir.py ├── plt_interp.py └── plt_rayleigh.py └── chapter9 ├── filelist.txt ├── plt_3d.py ├── plt_contour.py ├── plt_gridspec.py ├── plt_in_plt.py ├── simple_2d.py └── subplot_2x3.py /LICENSE.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyjbooks/py4science/0cf524c47c19c5d36763e5b7501107e0ecff8c54/LICENSE.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 「科学技術計算のためのPython入門――開発基礎、必須ライブラリ、高速化」 2 | 3 | 本レポジトリは、技術評論社から出版された以下の書籍 4 | のWeb補足情報を提供するためのものです。 5 | 6 | 7 | 8 | タイトル: 科学技術計算のためのPython入門――開発基礎、必須ライブラリ、高速化 9 | 著者: 中久喜 健司(なかくき けんじ) 10 | 単行本(ソフトカバー): 416ページ 11 | 出版社: 技術評論社 12 | 言語: 日本語 13 | ISBN-10: 4774183881 14 | ISBN-13: 978-4774183886 15 | 発売日: 2016/9/24 16 | 技術評論社のサポートページ: http://gihyo.jp/book/2016/978-4-7741-8388-6/ 17 | 18 | 本レポジトリでは、主に書籍中のソースコードを提供するとともに、Webサポートページに 19 | 上記の書籍をサポートする情報を提供します。 20 | 21 | GitHubレポジトリ: https://github.com/pyjbooks/py4science 22 | 同サポートページ: https://pyjbooks.github.io/py4science/ 23 | 24 | 25 | # ソースコードについて 26 | 27 | ## ファイルの所在 28 | 29 | 本レポジトリのmasterブランチの「src」フォルダ以下に、書籍の章ごとに分けて格納してあります。Gitを使える方は、クローンして入手してください。Gitを使えない方は、本GitHubレポジトリのトップページで、[Clone or download]というボタンを押して、zipファイルとしてダウンロードしてください。 30 | 31 | ## 「改行」と「空白」 32 | 書籍の中では、紙幅の都合上、*「改行」や「空白」をわざと減らしている*部分がありますが、本レポジトリに含まれるソースコードは、PEP 8に準拠できるように改行や空白を挿入しています。 33 | 34 | ## import文の省略 35 | また、ソースコードの冒頭に含まれるimport文についても、紙幅の都合上、書籍の中では*省略している場合があります*。以下のimport文が先頭に付いていることを前提としていますので、ご注意ください。本レポジトリに含まれるソースコードでは、省略せずに記載しています。 36 | 37 | import numpy as np # NumPyの別名はnp 38 | import scipy as sp # SciPyの別名はsp 39 | import pandas as pd # pandasの別名はpd 40 | import matplotlib as mpl # Matplotlibの別名はmpl 41 | import matplotlib.pyplot as plt # Matplotlib.pyplotの別名はplt 42 | import numexpr as ne # Numexprの別名はne 43 | 44 | ## Matplotlibの設定 45 | 46 | Matplotlibの設定がユーザの環境によって異なることで、本書の中で示したプロット結果と、多少「体裁」が異なる結果が得られる場合があります。その場合には、本書の9.2項を参考に、設定をご自分で調整してみてください。 47 | 48 | 特に、本書では以下の設定を推奨しており、本書に示した図と異なる場合には以下の設定を加えてみてください。(「mpl」は上記のとおり、「matplotlib」の別名) 49 | 50 | mpl.rcParams['figure.autolayout'] = True 51 | mpl.rcParams['font.size'] = 14 52 | mpl.rcParams['axes.grid'] = True 53 | 54 | また、インタラクティブモードがoffになっている場合は、プロットした図が表れない場合があります。 55 | その場合は、`plt.ion()`(「plt」は上記のとおり「matplotlib.pyplot」の別名)として、インタラクティブモードをonにしてください。 56 | もしくは、プロットの最後に、`plt.show()`を追加することで、図を表示させることができます。 57 | 58 | ## その他 59 | 60 | 稀に間違いが見つかった場合などに、本レポジトリのソースコードにおいては修正が加えられている場合があります。その他にも、書籍の中のソースコードに、上記のとおりimport文が加えられている場合や、軽微な修正が行われている場合があります。 61 | 62 | # 正誤表 63 | 64 | 本レポジトリの「error_table.txt」に、本書中の誤記等の訂正を示してあります。 65 | 66 | # ライセンス 67 | 68 | 本レポジトリのソースコードについては、「LICENSE.md」に示したとおりです。 69 | 70 | -------------------------------------------------------------------------------- /cover_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyjbooks/py4science/0cf524c47c19c5d36763e5b7501107e0ecff8c54/cover_image.png -------------------------------------------------------------------------------- /error_table.txt: -------------------------------------------------------------------------------- 1 | p.178 (前頁から続く「リスト5.3」の最終行のコメント) 2 | 誤)# 結果は 3*5*5=45(追加したメソッドの確認) 3 | 正)# 結果は 3*3*5=45(追加したメソッドの確認) 4 | 5 | 6 | ※以下の全ての誤記は、第4刷以降修正済み 7 | 8 | p. 71 9 | 誤)そして、その実行文の返り値(計算結果)はOut[3]:の後ろに表示されています。 10 | 正)そして、その実行文の返り値(計算結果)はOut[4]:の後ろに表示されています。 11 | 12 | p. 195 (上から6行目) 13 | 誤)laodtxtとgenfromtxtを利用... 14 | 正)loadtxtとgenfromtxtを利用... 15 | 16 | p. 196 17 | 誤)OOXML形式(Office Open XML、拡張子.xlsx/.xlsm):openpyxl、xlwings 18 | 正)OOXML形式(Office Open XML、拡張子.xlsx/.xlsm):xlrd、openpyxl、xlwings 19 | (注:xlrdのVersion 0.8.0以降では、OOXML形式にも対応しており上記のとおり訂正しますが、 20 | まだまだ機能的には発展途上と考えておいた方が良いでしょう。) 21 | 22 | p. 222 (IPythonのコード例のうち、In [3]: の行) 23 | 誤)# 16 bit符号なし整数型のndarray 24 | 正)# 64 bitの浮動小数点で構成される複素数 25 | 26 | p.294 27 | 誤---ここから 28 | In [10]: dat8.index = ['un', 'due', 'trois', 'quatre'] 29 | Out[10]: dat8 30 | un 1 31 | due 3 32 | trois NaN 33 | quatre 12 34 | dtype: float64 35 | 誤---ここまで 36 | 正---ここから 37 | In [10]: dat7.index = ['un', 'due', 'trois', 'quatre'] 38 | Out[10]: dat7 39 | un 1 40 | due 3 41 | trois 6 42 | quatre 12 43 | dtype: int64 44 | 正---ここまで 45 | 46 | 47 | ※以下の4つの誤記は、第2刷以降修正済み 48 | 49 | p. 199とp.200のソースコード中(各ページ1か所) 50 | 誤)# 保存lするオブジェクトの準備 51 | 正)# 保存するオブジェクトの準備 52 | 53 | p.363 54 | 誤)In [14]: %run numba_jit.py 55 | 正)In [14]: %run spd_numba1.py 56 | 57 | p.366 58 | 誤)In [15]: %run numba_classjit.py # @jitclassデコレータが無効な場合 59 | 正)In [15]: %run spd_numba2.py # @jitclassデコレータが無効な場合 60 | 61 | p.366 62 | 誤)In [16]: %run numba_classjit.py # @jitclassデコレータが有効な場合 63 | 正)In [16]: %run spd_numba2.py # @jitclassデコレータが有効な場合 64 | 65 | -------------------------------------------------------------------------------- /src/chapter1/c_bench1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | const int N = 10000; 6 | const int M = 1000; 7 | const int L = 10000; 8 | 9 | int main(int argc, char** argv) 10 | { 11 | int i, j, k; 12 | double a[M], S[N][L], x[N][M], y[M][L]; 13 | LARGE_INTEGER start_pc, end_pc, freq_pc; 14 | 15 | /* ① 配列に値を設定 */ 16 | srand(1); 17 | double rnd_max = (double) RAND_MAX; 18 | for (i=0; i 1000: 6 | kmax = 1000 7 | k = 0 8 | n = 2 9 | while k < kmax: 10 | i = 0 11 | while i < k and n % p[i] != 0: 12 | i = i + 1 13 | if i == k: 14 | p[k] = n 15 | k = k + 1 16 | result.append(n) 17 | n = n + 1 18 | return result 19 | -------------------------------------------------------------------------------- /src/chapter12/cython_2.pyx: -------------------------------------------------------------------------------- 1 | """ NumPyのndarrayを使う関数のCythonプログラム例 """ 2 | 3 | cimport numpy as np 4 | from cython.parallel import prange 5 | 6 | N = 10000000 7 | 8 | def matrix_cal_cy(np.ndarray[double, ndim=1] X, 9 | np.ndarray[double, ndim=1] Y, double a): 10 | cdef int i 11 | for i in prange(N, nogil=True): 12 | if Y[i] < 0: 13 | Y[i] += 10.0 + 1e-7*i 14 | return (a*X + np.exp(Y)) 15 | -------------------------------------------------------------------------------- /src/chapter12/cython_3.py: -------------------------------------------------------------------------------- 1 | import cython_2 2 | import numpy as np 3 | import time 4 | 5 | N = 10000000 6 | 7 | 8 | # cython_2.pyの関数のPythonオリジナル 9 | def matrix_cal(X, Y, a): 10 | for i in range(N): 11 | if Y[i] < 0: 12 | Y[i] += 10.0 + 1e-7*i 13 | return a*X + np.exp(Y) 14 | 15 | if __name__ == '__main__': 16 | # 計算に使うndarrayを生成 17 | a = 3.4 18 | X = np.random.randn(N) 19 | Y = np.random.randn(N) 20 | # Cython版で計算 21 | ts = time.clock() 22 | Z = cython_2.matrix_cal_cy(X, Y, a) 23 | print('Cython版の処理の時間: {0:.3f}[s]'.format(time.clock() - ts)) 24 | # オリジナルのmatrix_calで計算 25 | ts = time.clock() 26 | Z = matrix_cal(X, Y, a) 27 | print('オリジナル版の処理の時間: {0:.3f}[s]'.format(time.clock() - ts)) 28 | -------------------------------------------------------------------------------- /src/chapter12/filelist.txt: -------------------------------------------------------------------------------- 1 | p.352 : cython_1.pyx 2 | p.353 : setup_cy1.py 3 | p.354 : cython_2.pyx 4 | p.355 : setup_cy2.py 5 | p.356 : cython_3.py 6 | p.358 : py_c_api.c 7 | p.358 : myfunc_cdelc.c 8 | p.359 : myfunc_stdcall.c 9 | p.362 : spd_numba1.py 10 | p.365 : spd_numba2.py 11 | p.367 : spd_numba4.py 12 | p.368 : spd_numexpr.py 13 | 14 | -------------------------------------------------------------------------------- /src/chapter12/myfunc_cdecl.c: -------------------------------------------------------------------------------- 1 | /* myfunc_cdelc.c */ 2 | int myadd(int x, int y) { 3 | return x + y; 4 | } 5 | -------------------------------------------------------------------------------- /src/chapter12/myfunc_stdcall.c: -------------------------------------------------------------------------------- 1 | /* myfunc_stdcall.c */ 2 | #define EXPORT __declspec(dllexport) __stdcall 3 | 4 | EXPORT int myadd(int x, int y) { 5 | return x + y; 6 | } 7 | -------------------------------------------------------------------------------- /src/chapter12/py_c_api.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | static PyObject * 4 | fact(PyObject *self, PyObject *args) 5 | { 6 | int n; 7 | int i; 8 | int ret=1; 9 | 10 | if (!PyArg_ParseTuple(args, "i", &n)) 11 | return NULL; 12 | 13 | for (i=n; i>0; i--) ret *= i; 14 | 15 | return Py_BuildValue("i", ret); 16 | } 17 | -------------------------------------------------------------------------------- /src/chapter12/setup_cy1.py: -------------------------------------------------------------------------------- 1 | from distutils.core import setup 2 | from Cython.Build import cythonize 3 | 4 | setup( 5 | ext_modules=cythonize("cython_1.pyx") 6 | ) 7 | -------------------------------------------------------------------------------- /src/chapter12/setup_cy2.py: -------------------------------------------------------------------------------- 1 | from distutils.core import setup 2 | from distutils.extension import Extension 3 | from Cython.Build import cythonize 4 | import numpy as np 5 | 6 | extensions = [ 7 | Extension("cython_2", ["cython_2.c"], 8 | include_dirs=[np.get_include()], 9 | libraries=['npymath'], 10 | library_dirs=['C:/Python/Anaconda3/Lib/site-packages/numpy/core/lib'], 11 | extra_compile_args=['/openmp'], 12 | extra_link_args=['/openmp']), 13 | ] 14 | 15 | setup( 16 | name="My matrix calc", 17 | ext_modules=cythonize(extensions), 18 | include_dirs=[np.get_include()] 19 | ) 20 | -------------------------------------------------------------------------------- /src/chapter12/spc_numba1.py: -------------------------------------------------------------------------------- 1 | from numba import jit 2 | import numpy as np 3 | import time 4 | 5 | 6 | def mult_abs_basic(n, x, y): 7 | r = [] 8 | for i in range(n): 9 | r.append(abs(x[i] * y[i])) 10 | return r 11 | 12 | 13 | def mult_abs_numpy(x, y): 14 | return np.abs(x*y) 15 | 16 | 17 | # @jitデコレータで高速化を図る 18 | @jit('f8[:](i8, c16[:], c16[:])', nopython=True) 19 | def mult_abs_numba(n, x, y): 20 | r = np.zeros(n) 21 | for i in range(n): 22 | r[i] = abs(x[i] * y[i]) 23 | return r 24 | 25 | 26 | if __name__ == "__main__": 27 | # %% 処理するデータを生成 28 | N = 1000000 29 | x_np = (np.random.rand(N) - 0.5) + 1J * (np.random.rand(N) - 0.5) 30 | y_np = (np.random.rand(N) - 0.5) + 1J * (np.random.rand(N) - 0.5) 31 | x = list(x_np) 32 | y = list(y_np) 33 | 34 | # %% 処理時間比較 35 | ts = time.clock() 36 | b1 = mult_abs_basic(N, x, y) 37 | print('Pythonの計算時間 : {0:0.3f}[s]'.format(time.clock() - ts)) 38 | ts = time.clock() 39 | b1 = mult_abs_numpy(x_np, y_np) 40 | print('NumPyの計算時間 : {0:0.3f}[s]'.format(time.clock() - ts)) 41 | ts = time.clock() 42 | b1 = mult_abs_numba(N, x_np, y_np) 43 | print('Numbaの計算時間 : {0:0.3f}[s]'.format(time.clock() - ts)) 44 | -------------------------------------------------------------------------------- /src/chapter12/spd_numba2.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import time 3 | from numba import jitclass # import jitclass decorator 4 | from numba import int32, float64 # 型名称をimport 5 | 6 | # クラスの属性の型を規定 7 | spec = [ 8 | ('size', int32), 9 | ('arr', float64[:]), 10 | ] 11 | 12 | 13 | @jitclass(spec) 14 | class RandomCode(object): 15 | 16 | def __init__(self, size): 17 | self.size = size 18 | self.arr = np.random.randn(size) 19 | 20 | def bit_code(self): 21 | for i in range(self.size): 22 | if self.arr[i] >= 0.5: 23 | self.arr[i] = 1 24 | else: 25 | self.arr[i] = -1 26 | return self.arr 27 | 28 | 29 | if __name__ == '__main__': 30 | a = RandomCode(1000000) 31 | ts = time.clock() 32 | cdat = a.bit_code() 33 | print('コード生成所用時間 : {0:.3f}[s]'.format(time.clock() - ts)) 34 | -------------------------------------------------------------------------------- /src/chapter12/spd_numba4.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from numba import jit 3 | 4 | nthreads = 2 # 2コアのCPUで検証するのでスレッド数を2にする 5 | size = 10000000 6 | 7 | 8 | # これが高速化する前の関数 9 | def func_np(a, b): 10 | return np.exp(2.1 * a + 3.2 * b) 11 | 12 | 13 | # Numbaで高速化した関数 14 | @jit('void(double[:], double[:], double[:])', nopython=True, nogil=True) 15 | def inner_func_nb(result, a, b): 16 | for i in range(len(result)): 17 | result[i] = np.exp(2.1 * a[i] + 3.2 * b[i]) 18 | -------------------------------------------------------------------------------- /src/chapter12/spd_numexpr.py: -------------------------------------------------------------------------------- 1 | import time 2 | import numexpr as ne 3 | import numpy as np 4 | 5 | # 大きなNumPyの配列を作る 6 | N = 10000000 7 | a = np.random.randn(N) 8 | b = np.random.randn(N) 9 | 10 | # NumPyに三角関数計算と積和演算をさせて時間を計測 11 | ts1 = time.clock() 12 | c1 = (a * np.sin(b)).sum() 13 | te1 = time.clock() 14 | print('NumPy : %.6f [s]' % (te1 - ts1)) 15 | 16 | # Numexprに上記と同じ計算をさせて時間を計測 17 | ts2 = time.clock() 18 | c2 = ne.evaluate('sum(a * sin(b))') 19 | te2 = time.clock() 20 | print('Numexpr : %.6f [s]' % (te2 - ts2)) 21 | 22 | # どれくらい高速化できたか評価する 23 | print('%.3f[%] 早く処理できました。' % (100-100*(te2-ts2)/(te1-ts1))) 24 | -------------------------------------------------------------------------------- /src/chapter2/Readme.txt: -------------------------------------------------------------------------------- 1 | 第2章のロケットシミュレーションプログラムのソースコードは 2 | 以下のGitHubレポジトリを参照してください。 3 | 4 | https://github.com/pyjbooks/PyRockSim.git 5 | 6 | -------------------------------------------------------------------------------- /src/chapter3/fc.py: -------------------------------------------------------------------------------- 1 | """ fc.py """ 2 | import numpy as np 3 | n = 20 4 | 5 | 6 | def func_c(): 7 | a = np.arange(0, n*n).reshape(n, n) + np.identity(n) 8 | b = np.arange(0, n) 9 | x = np.dot(np.linalg.inv(a), b) 10 | -------------------------------------------------------------------------------- /src/chapter3/filelist.txt: -------------------------------------------------------------------------------- 1 | p.80 : myscript.py 2 | p.87 : prun1.py 3 | p.88 : fc.py 4 | p.90 : prun2.py 5 | 6 | -------------------------------------------------------------------------------- /src/chapter3/myscript.py: -------------------------------------------------------------------------------- 1 | def my_add(x, y): 2 | """ 2つの数字を加算する """ 3 | out = x + z # バグ:zという変数は定義されていない 4 | return out + y 5 | 6 | if __name__ == "__main__": 7 | a, b = 3, 4 8 | z = my_add(a, b) 9 | print(z) 10 | -------------------------------------------------------------------------------- /src/chapter3/prun1.py: -------------------------------------------------------------------------------- 1 | """ prun1.py """ 2 | import numpy as np 3 | 4 | 5 | def func_a(): 6 | a = np.random.randn(500, 500) 7 | return a**2 8 | 9 | 10 | def func_b(): 11 | a = np.random.randn(1000, 1000) 12 | return a**2 13 | 14 | 15 | def func_both(): 16 | a = func_a() 17 | b = func_b() 18 | return [a, b] 19 | 20 | if __name__ == '__main__': 21 | func_both() 22 | -------------------------------------------------------------------------------- /src/chapter3/prun2.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from memory_profiler import profile 3 | 4 | 5 | @profile # 次の関数はメモリプロファイラの分析対象とする 6 | def func_a(): 7 | a = np.random.randn(500, 500) 8 | return a**2 9 | 10 | 11 | @profile # 次の関数はメモリプロファイラの分析対象とする 12 | def func_b(): 13 | a = np.random.randn(1000, 1000) 14 | return a**2 15 | 16 | 17 | def func_both(): 18 | a = func_a() 19 | b = func_b() 20 | return [a, b] 21 | 22 | if __name__ == '__main__': 23 | func_both() 24 | -------------------------------------------------------------------------------- /src/chapter4/decorator_1.py: -------------------------------------------------------------------------------- 1 | # デコレータ(debug_log)の機能を有効にするためのフラグ 2 | debug_trace = True 3 | # 上記フラグが有効の場合、ログファイルを開く 4 | if debug_trace: 5 | log_file = open("debug.log", "w", encoding='utf-8') 6 | 7 | 8 | # デコレータ関数の定義 9 | def debug_log(func): 10 | if debug_trace: 11 | def func_and_log(*args, **kwargs): 12 | # funcの実行前にログファイルに記録 13 | log_file.write("開始 %s: %s, %s\n" % 14 | (func.__name__, args, kwargs)) 15 | # funcをそのまま実行 16 | r = func(*args, **kwargs) 17 | # func終了時に再度ログファイルに記録 18 | log_file.write("終了 %s: 返り値 %s\n" % (func.__name__, r)) 19 | return r 20 | return func_and_log 21 | else: 22 | return func # debug_trace = False なら何も変えない 23 | 24 | 25 | # デコレータでmyFuncの機能を変更 26 | @debug_log 27 | def myfunc(x): 28 | return x+x 29 | 30 | # デコレータで変更後のmyFuncを実行 31 | myfunc(3) 32 | myfunc(5) 33 | log_file.close() # ログファイルを閉じる 34 | -------------------------------------------------------------------------------- /src/chapter4/filelist.txt: -------------------------------------------------------------------------------- 1 | p.157 : decorator_1.py 2 | p.160 : module_1.py 3 | p.161 : module_2.py 4 | 5 | -------------------------------------------------------------------------------- /src/chapter4/module_1.py: -------------------------------------------------------------------------------- 1 | # ファイル名: module_1.py """ 2 | print("module_1 is imported.") 3 | wgt = 60.5 # 初期体重 [kg] 4 | 5 | 6 | def teacher(x): 7 | if x > 60: 8 | print("体重オーバーです") 9 | else: 10 | print("適正体重です") 11 | -------------------------------------------------------------------------------- /src/chapter4/module_2.py: -------------------------------------------------------------------------------- 1 | # ファイル名: module_2.py 2 | import module_1 # module_1をimportして内部のプログラムを実行 3 | 4 | 5 | # module_1の内部の変数にアクセス 6 | weight = module_1.wgt 7 | # 以下、複数回にわたり、module_1の内部の関数にアクセス 8 | module_1.teacher(weight) # module_1の関数にアクセス 9 | weight = module_1.run(weight) # module_1の 10 | module_1.teacher(weight) 11 | -------------------------------------------------------------------------------- /src/chapter5/class1.py: -------------------------------------------------------------------------------- 1 | # クラスの定義 2 | class MyClass(object): # (1)継承するクラスなし 3 | """ (2)簡単なクラスの例のDocstring """ 4 | # (3)クラスのデータx、yの定義 5 | x = 0 6 | y = 0 7 | 8 | def my_print(self): 9 | self.x += 1 # xをインスタンス固有のオブジェクトとして扱う 10 | MyClass.y += 1 # yをクラス固有のオブジェクトとして扱う 11 | print('(x, y) = ({}, {})'.format(self.x, self.y)) 12 | 13 | 14 | # クラスのインスタンス化 15 | f = MyClass # (5)()が付いてない場合はクラスに別名を付けただけ 16 | a = MyClass() # (6)MyClassクラスのインスタンスを生成しaという名前を付ける 17 | b = f() # (7)f()はMyClass()と同じ意味(別名を使っている。(5)参照) 18 | # (8)メソッドの実行 19 | a.my_print() 20 | b.my_print() 21 | b.my_print() 22 | -------------------------------------------------------------------------------- /src/chapter5/class2.py: -------------------------------------------------------------------------------- 1 | # クラスの定義 2 | class MyClass(object): # 継承するクラス無し 3 | """ 簡単なクラスの例のDocstring """ 4 | 5 | def __init__(self, x, y): 6 | self.x = x 7 | self.y = y 8 | 9 | def my_print(self): 10 | print('{}年のオリンピック開催地は{}'.format(self.x, self.y)) 11 | 12 | # クラスのインスタンス化 13 | a = MyClass(2016, 'リオデジャネイロ') 14 | b = MyClass(2020, '東京') 15 | # メソッドの実行 16 | a.my_print() 17 | b.my_print() 18 | -------------------------------------------------------------------------------- /src/chapter5/class3.py: -------------------------------------------------------------------------------- 1 | # (1)グローバル名前空間にxを定義 2 | x = 100 3 | 4 | 5 | class MyClass: 6 | # (2)このクラスのデータとしてiとxを定義 7 | i = 10 # メソッドprice()の中で参照される 8 | x += 2 # グローバル名前空間のxに2を加えてデータxを定義 9 | xx = x + 2 # (3)MyClassの中のデータのxを参照 10 | print('xx = ', xx) 11 | 12 | def price(self): 13 | y = self.i * x # (4)グローバル名前空間のオブジェクトxを参照 14 | z = self.i * self.x # (5)インスタンス属性→クラス属性の順に検索して参照 15 | # z = i * x # (6)これはエラー(ここからデータiは見えない) 16 | print("price y = %d" % y) 17 | print("price z = %d" % z) 18 | 19 | def shop(self): 20 | # price() # (7)エラーとなる(NameError) 21 | self.price() # (8)これはOK 22 | # MyClass.price(self) # (9)これでもOK 23 | MyClass.i = 20 # (10)クラスのデータを変更 24 | print("メソッド shop 終了") 25 | 26 | 27 | # (11)動作確認のための実行コード 28 | if __name__ == '__main__': 29 | a = MyClass() 30 | b = MyClass() 31 | a.shop() # この中で MyClass.i = 20 が実行される 32 | print('(a.i, b.i) = ({}, {})'.format(a.i, b.i)) 33 | a.i = 2 # インスタンス属性を設定 34 | MyClass.i = 4 # クラス属性の値を変更 35 | print('(a.i, b.i) = ({}, {})'.format(a.i, b.i)) 36 | -------------------------------------------------------------------------------- /src/chapter5/classmethod1.py: -------------------------------------------------------------------------------- 1 | # クラスCoeffVarを定義 2 | class CoeffVar(object): 3 | coefficient = 1 4 | 5 | @classmethod # メソッドmulをクラスメソッド化 6 | def mul(cls, fact): # 第1引数はcls 7 | return cls.coefficient * fact 8 | 9 | 10 | # クラスCoeffvarを継承するクラスMulFiveを定義 11 | class MulFive(CoeffVar): 12 | coefficient = 5 13 | 14 | 15 | x = MulFive.mul(4) # CoeffVar.mul(MulFive, 4) -> 20 16 | -------------------------------------------------------------------------------- /src/chapter5/filelist.txt: -------------------------------------------------------------------------------- 1 | p.173 : class1.py 2 | p.175 : class2.py 3 | p.177 : inheritance1.py 4 | p.179(リスト5.4) : static1.py 5 | p.179(リスト5.5) : instance1.py 6 | p.180 : classmethod1.py 7 | p.182 : scope_error.py 8 | p.183 : class3.py 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/chapter5/inheritance1.py: -------------------------------------------------------------------------------- 1 | # (1)クラスMyBaseの定義(MyDerivの基底クラス) 2 | class MyBase(object): 3 | coeff = 2 4 | 5 | def __init__(self, x): 6 | self.x = x 7 | 8 | def mult(self): 9 | return self.coeff * self.x 10 | 11 | 12 | # (2)クラスMyDerivの定義(MyBaseの派生クラス) 13 | class MyDeriv(MyBase): 14 | coeff = 3 # (3)属性を再定義 15 | 16 | # (4)コンストラクタの再定義 17 | def __init__(self, x, y): 18 | super().__init__(x) # (5)基底クラスのメソッドの呼び出し例 19 | self.y = y # (6)属性yを追加しインスタンス化時に初期化 20 | 21 | # (7)新しいメソッドを追加 22 | def mult2(self): 23 | return self.coeff * self.x * self.y 24 | 25 | 26 | # (8)MyBaseとMyDerivを使った計算例 27 | a = MyBase(3) # MyBaseのインスタンスを生成 28 | print(a.mult()) # 結果は 2*3=6 29 | b = MyDeriv(3, 5) # MyDerivのインスタンスを生成 30 | print(b.mult()) # 結果は 3*3=9 (継承したメソッドの確認) 31 | print(b.mult2()) # 結果は 3*5*5=45(追加したメソッドの確認) 32 | -------------------------------------------------------------------------------- /src/chapter5/instance1.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | 4 | class MyTime(object): 5 | def __init__(self, hour, minutes, sec): 6 | self.hour = hour 7 | self.minutes = minutes 8 | self.sec = sec 9 | 10 | @staticmethod # now()をスタティックメソッド化 11 | def now(): 12 | t = time.localtime() 13 | return MyTime(t.tm_hour, t.tm_min, t.tm_sec) 14 | 15 | @staticmethod # two_hours_later()をスタティックメソッド化 16 | def two_hours_later(): 17 | t = time.localtime(time.time() + 7200) 18 | return MyTime(t.tm_hour, t.tm_min, t.tm_sec) 19 | 20 | # クラスMyTimesのインスタンス化を3つの方法で行う 21 | a = MyTime(15, 20, 58) # __init__を使う通常のインスタンス化 22 | b = MyTime.now() # スタティックメソッドによるインスタンス化(1) 23 | c = MyTime.two_hours_later() # スタティックメソッドによるインスタンス化(2) 24 | -------------------------------------------------------------------------------- /src/chapter5/scope_error.py: -------------------------------------------------------------------------------- 1 | x = 10 2 | 3 | 4 | class MyClass(object): 5 | x = 3 # xが所属する名前空間は生成される 6 | 7 | def __init__(self, y): 8 | self.x += y 9 | 10 | def my_add(self, z): 11 | x = x + z # エラー: xのスコープは生成されていない 12 | # self.x とすれば参照可能 13 | 14 | 15 | if __name__ == '__main__': 16 | a = MyClass(10) 17 | a.my_add(10) 18 | print(a.x) 19 | -------------------------------------------------------------------------------- /src/chapter5/static1.py: -------------------------------------------------------------------------------- 1 | class MyCalc(object): 2 | @staticmethod 3 | def my_add(x, y): 4 | return x + y 5 | 6 | a = MyCalc.my_add(5, 9) # a = 14 となる(MyCalcのインスタンスを作成しなくてよい) 7 | -------------------------------------------------------------------------------- /src/chapter6/csv_read1.py: -------------------------------------------------------------------------------- 1 | import csv # 標準モジュールcsvを読み込んで使用可能にする 2 | 3 | 4 | # CSVファイルの読み出し 5 | with open('data1.csv', 'r', encoding='utf8') as f: 6 | dat = [k for k in csv.reader(f)] # リスト内包表記を使う 7 | 8 | # CSVファイルの書き込み 9 | with open('out.csv', 'w', newline='') as f: 10 | writer = csv.writer(f) 11 | writer.writerows(dat) 12 | -------------------------------------------------------------------------------- /src/chapter6/csv_read2.py: -------------------------------------------------------------------------------- 1 | import numpy as np # NumPyをimport 2 | import csv # 標準モジュールcsvを読み込む 3 | 4 | 5 | # CSVファイルからの読み込み 6 | dat = np.loadtxt('data1.csv', delimiter=',', skiprows=1, dtype=float) 7 | 8 | # ndarrayのdatをCSVファイルへ書き込み(日本語を扱えない点に注意) 9 | np.savetxt('data1_saved.csv', dat, fmt='%.1f,%.8f,%d', 10 | header='time,vel,alt', comments='') 11 | 12 | # ndarrayのdatをCSVファイルの書き込み(日本語も扱える) 13 | with open('out.csv', 'w', newline='', encoding='utf-8') as f: 14 | f.write('time,速度,高度\n') 15 | writer = csv.writer(f) 16 | writer.writerows(dat) 17 | -------------------------------------------------------------------------------- /src/chapter6/data1.csv: -------------------------------------------------------------------------------- 1 | time,速度,高度 2 | 0.1,0,10 3 | 0.2,7.532680553,20 4 | 0.3,11.28563849,35 5 | 0.4,15.02255891,40 6 | 0.5,18.73813146,42 7 | 0.6,22.42707609,43 8 | 0.7,26.08415063,60 9 | 0.8,29.70415816,80 10 | 0.9,33.28195445,121 11 | 1,36.81245527,150 12 | -------------------------------------------------------------------------------- /src/chapter6/excel_read1.py: -------------------------------------------------------------------------------- 1 | import xlwt # Excelファイル書き込み用 2 | import xlrd # Excelファイル読み出し用 3 | 4 | # --- Excelファイルの書き込み 5 | # Work bookを準備 6 | wb = xlwt.Workbook() 7 | # シートを追加 8 | ws = wb.add_sheet('シート1') 9 | # シートの特定のセルに値を入れる 10 | ws.write(0, 0, 'Upper Left') 11 | ws.write(1, 0, 1) 12 | ws.write(1, 1, 2) 13 | ws.write(1, 2, xlwt.Formula("A3+B3")) 14 | # Work bookに名前を付けて保存 15 | wb.save('xlwt.xls') 16 | 17 | # --- Excelファイルの読み出し 18 | # 読み出すWork bookを指定して開く 19 | wb = xlrd.open_workbook('xlwt.xls') 20 | # シートを名前で指定する 21 | st = wb.sheet_by_name('シート1') 22 | # 指定したシートの特定のセルの値を読み出して表示 23 | print(st.cell(0, 0).value) 24 | -------------------------------------------------------------------------------- /src/chapter6/filelist.txt: -------------------------------------------------------------------------------- 1 | p.193 : data1.csv 2 | p.194 : csv_read1.py 3 | p.195 : csv_read2.py 4 | p.197 : excel_read1.py 5 | p.198 : openpyxl1.py 6 | p.199 : pickle1.py 7 | p.200 : pickle2.py 8 | p.201 : pickle3.py 9 | p.202 : npynpz1.py 10 | p.203 : ndf5-1.py 11 | p.203 : matread1.py 12 | 13 | -------------------------------------------------------------------------------- /src/chapter6/hdf5-1.py: -------------------------------------------------------------------------------- 1 | import h5py 2 | import numpy as np 3 | 4 | # 保存するデータを生成 5 | t = np.arange(0, 5, 0.1) 6 | y = np.sin(2*np.pi*0.3*t) 7 | dist = [2, 5, 1, 3, 8, 9, 12] 8 | 9 | # データの一部を階層構造にして保存 10 | with h5py.File('data1.h5', 'w') as f: 11 | f.create_group('wave') 12 | f.create_dataset('wave/t', data=t) 13 | f.create_dataset('wave/y', data=y) 14 | f.create_dataset('dist', data=dist) 15 | 16 | # withブロックを抜けると f は一旦閉じられる 17 | 18 | # データの読み出し 19 | with h5py.File('data1.h5', 'r') as f: 20 | t = np.array(f['wave/t']) # 以下、ndarrayとして読み出し 21 | y = np.array(f['wave/y']) 22 | dist = np.array(f['dist']) 23 | -------------------------------------------------------------------------------- /src/chapter6/matread1.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import scipy as sp 3 | 4 | # 保存するデータを生成 5 | t = np.arange(0, 5, 0.1) 6 | y = np.sin(2*np.pi*0.3*t) 7 | 8 | # MAT-fileの書き出し例 9 | out_dat = {} 10 | out_dat['time'] = t # ndarrayのtをtimeという名前で格納 11 | out_dat['y'] = y 12 | sp.io.savemat('data2.mat', out_dat, format='5') 13 | 14 | # MAT-fileの読み込み例 15 | matdat = sp.io.loadmat('data1.mat', squeeze_me=True) 16 | tt = matdat['time'] # ndarray が生成される 17 | -------------------------------------------------------------------------------- /src/chapter6/npynpz1.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | # npyにndarrayを1つ保存 4 | a = np.array([1, 2, 3]) 5 | np.save('foo', a) 6 | 7 | # npyからndarrayを復元 8 | a2 = np.load('foo.npy') 9 | 10 | # npz(複数のndarrayアーカイブ)にndarrayを出力 11 | b = np.array([[1, 2], [3, 4]]) 12 | np.savez('foo.npz', a=a, b2=b) # bにb2という名前を付けて保存 13 | 14 | # npzファイルの入力 15 | with np.load('foo.npz') as data: 16 | a3 = data['a'] # aという名前の変数だけ取り出す 17 | b3 = data['b2'] 18 | -------------------------------------------------------------------------------- /src/chapter6/openpyxl1.py: -------------------------------------------------------------------------------- 1 | # openpyxlから必要な関数(load_workbook)をimport 2 | from openpyxl import load_workbook 3 | import numpy as np # NumPyもimport 4 | 5 | # WorkBookを開く 6 | wb = load_workbook(filename='Sample1.xlsx', read_only=True, 7 | data_only=True, use_iterators=True) 8 | # WorkSheetを名前で指定 9 | ws = wb['温度変化'] 10 | 11 | # あらかじめデータを格納するNumPyのndarrayを作成しておく 12 | Nrow = 11 13 | time_vec = np.zeros(Nrow) 14 | temp_vec = np.zeros(Nrow) 15 | 16 | # データの読み出し 17 | for i, row in enumerate(ws.iter_rows(row_offset=1)): 18 | time_vec[i] = row[0].value 19 | temp_vec[i] = row[1].value 20 | -------------------------------------------------------------------------------- /src/chapter6/pickle1.py: -------------------------------------------------------------------------------- 1 | import pickle # 標準ライブラリpickleの読み込み 2 | 3 | # 保存するオブジェクトの準備 4 | mydata = [1, 2, 3] 5 | 6 | # オブジェクト(mydata)をファイル'pickle1.pickle'(拡張子は.pickleでなくても良い)に保存 7 | with open('pickle1.pickle', 'wb') as f: 8 | pickle.dump(mydata, f) 9 | 10 | # ファイル'pickle1.pickle'からデータを取り出してdatに代入 11 | with open('pickle1.pickle', 'rb') as f: 12 | dat = pickle.load(f) 13 | -------------------------------------------------------------------------------- /src/chapter6/pickle2.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import numpy as np 3 | 4 | 5 | # 保存lするオブジェクトの準備 6 | a = np.float(2.3) 7 | b = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]]) 8 | c = {'yokohama': 1, 'tokyo': 2, 'nagoya': 3} 9 | 10 | # 複数オブジェクトを1つのファイルにpickle化 11 | with open('pickle1.pickle', 'wb') as f: 12 | pickle.dump(a, f) 13 | pickle.dump(b, f) 14 | pickle.dump(c, f) 15 | 16 | # pickle化したファイルから複数オブジェクトを読み出す 17 | with open('pickle1.pickle', 'rb') as f: 18 | a2 = pickle.load(f) 19 | b2 = pickle.load(f) 20 | c2 = pickle.load(f) 21 | -------------------------------------------------------------------------------- /src/chapter6/pickle3.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import numpy as np 3 | 4 | 5 | def pickle_vars(fname, mode='wb', **vars): 6 | """ 7 | 使い方 8 | pickle_vars('作成するファイル名', a=a, b=b, c=c) 9 | 引数には作成するファイル名と、オブジェクトを列挙する 10 | """ 11 | dic = {} 12 | for key in vars.keys(): 13 | exec('dic[key]=vars.get(key)') 14 | with open(fname, mode) as f: 15 | pickle.dump(dic, f) 16 | return dic 17 | 18 | if __name__ == "__main__": 19 | # 各種オブジェクトを生成 20 | a = np.float(2.3) 21 | b = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]]) 22 | c = {'yokohama': 1, 'tokyo': 2, 'nagoya': 3} 23 | # 複数の変数とそのデータを保存 24 | saved_dat = pickle_vars('pickle1.pickle', a=a, b=b, c=c) 25 | # pickle化したファイルからデータを読み出す 26 | with open('pickle1.pickle', 'rb') as f: 27 | dat = pickle.load(f) 28 | for key in dat.keys(): 29 | exec(key+'=dat.get(key)') # 元の変数でデータを復元 30 | -------------------------------------------------------------------------------- /src/chapter7/filelist.txt: -------------------------------------------------------------------------------- 1 | ソースファイルなし 2 | -------------------------------------------------------------------------------- /src/chapter8/filelist.txt: -------------------------------------------------------------------------------- 1 | p.252 : plt_rayleigh.py 2 | p.255 : plt_fft.py 3 | p.256 : plt_bode.py 4 | p.258 : plt_interp.py 5 | p.260 : plt_iir.py 6 | -------------------------------------------------------------------------------- /src/chapter8/plt_bode.py: -------------------------------------------------------------------------------- 1 | import scipy as sp 2 | import matplotlib.pyplot as plt 3 | 4 | # (1)scipyとは別にimportが必要 5 | from scipy import signal 6 | 7 | # (2)線形システムの定義 8 | s1 = sp.signal.lti([1], [1, 1]) 9 | 10 | # (3)bode関数による解析処理 11 | w, mag, phase = sp.signal.bode(s1) 12 | 13 | # (4)ボード線図の描画 14 | plt.figure(1) 15 | plt.subplot(2, 1, 1) 16 | plt.semilogx(w, mag) # Bode magnitude plot 17 | plt.box('on') 18 | plt.xlabel('周波数 [rad/s]') 19 | plt.ylabel('ゲイン [dB]') 20 | plt.title('ボード線図') 21 | plt.subplot(2, 1, 2) 22 | plt.semilogx(w, phase) # Bode phase plot 23 | plt.xlabel('周波数 [rad/s]') 24 | plt.ylabel('位相 [deg]') 25 | plt.box('on') 26 | plt.show() 27 | -------------------------------------------------------------------------------- /src/chapter8/plt_fft.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import scipy as sp 3 | import matplotlib.pyplot as plt 4 | # (1)scipyとは別にimportが必要 5 | from scipy.fftpack import fft 6 | 7 | # (2)30 Hzの信号とノイズの合成信号yを生成 8 | Fs = 500 # サンプリング周波数 9 | T = 1/Fs # サンプリング時間 10 | L = 2**14 # 信号の長さ(サンプリング数) 11 | t = sp.arange(L)*T # 時間ベクトル 12 | y = np.sin(2*np.pi*30*t) + 5*sp.randn(t.size) # 信号生成 13 | 14 | # (3)FFTを実行 15 | Y = sp.fftpack.fft(y, L)/L 16 | f = (Fs/L)*sp.arange(L/2 + 1) # 周波数ベクトル取得 17 | 18 | # (4)「元の時系列データ」と「FFTによる周波数解析結果」のプロット 19 | plt.figure(1) 20 | plt.subplot(2, 1, 1) 21 | plt.plot(t, y) 22 | plt.xlabel('時間 [s]') 23 | plt.ylabel('値') 24 | plt.subplot(2, 1, 2) 25 | plt.plot(f, 2*abs(Y[:L/2 + 1])) 26 | plt.xlabel('周波数 [Hz]') 27 | plt.ylabel('|Y(f)|') 28 | -------------------------------------------------------------------------------- /src/chapter8/plt_iir.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | # (1)scipyとは別にimportが必要 4 | import scipy.signal as signal 5 | 6 | # (2)Chebyshev I型のフィルタ設計 7 | b1, a1 = signal.iirfilter(4, Wn=0.2, rp=5, rs=40, 8 | btype='lowpass', ftype='cheby1') 9 | w1, h1 = signal.freqz(b1, a1) 10 | 11 | # (3)Cauer/elliptic型のフィルタ設計 12 | b2, a2 = signal.iirfilter(4, Wn=0.2, rp=5, rs=40, 13 | btype='lowpass', ftype='ellip') 14 | w2, h2 = signal.freqz(b2, a2) 15 | 16 | # (4)フィルタの周波数特性のプロット 17 | plt.title('周波数特性') 18 | plt.plot(w1, 20*np.log10(np.abs(h1)), 'k-', label='Chebyshev I') 19 | plt.plot(w2, 20*np.log10(np.abs(h2)), 'k--', label='Cauer/elliptic') 20 | plt.legend(loc='best') 21 | plt.ylabel('振幅 [dB]') 22 | plt.xlabel('周波数 [rad/sample]') 23 | plt.show() 24 | -------------------------------------------------------------------------------- /src/chapter8/plt_interp.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | 4 | # (1)名前が長いので別名を付ける 5 | import scipy.interpolate as ipl 6 | 7 | 8 | # (2)元の関数の定義 9 | def f(x): 10 | return (x-7) * (x-2) * (x+0.2) * (x-4) 11 | 12 | # (3)元データ生成(正解の値) 13 | x = np.linspace(0, 8, 81) 14 | y = np.array(list(map(f, x))) 15 | 16 | # (4)補間前の間隔が広いデータ 17 | x0 = np.arange(9) 18 | y0 = np.array(list(map(f, x0))) 19 | 20 | # (5)補間関数の設定(線形補間) 21 | # 補間関数の設定(線形補間/3次スプライン) 22 | f_linear = ipl.interp1d(x0, y0, bounds_error=False) 23 | f_cubic = ipl.interp1d(x0, y0, kind='cubic', bounds_error=False) 24 | # 補間処理の実行 25 | y1 = f_linear(x) # 線形補間 26 | y2 = f_cubic(x) # 3次スプライン補間 27 | 28 | # (6)補間データと元データの比較プロット 29 | plt.figure(1) 30 | plt.clf() 31 | plt.plot(x, y, 'k-', label='元の関数') 32 | plt.plot(x0, y0, 'ko', label='補間前データ', markersize=10) 33 | plt.plot(x, y1, 'k:', label='線形補間', linewidth=4) 34 | plt.plot(x, y2, 'k--', label='3次スプライン補間', linewidth=4, alpha=0.7) 35 | plt.legend(loc='best') 36 | plt.xlabel('x') 37 | plt.ylabel('y') 38 | plt.grid('on') 39 | -------------------------------------------------------------------------------- /src/chapter8/plt_rayleigh.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import scipy as sp 3 | import scipy.stats 4 | import matplotlib.pyplot as plt 5 | 6 | plt.style.use('ggplot') 7 | 8 | # (1)統計分布関数の設定(Freezeしておく) 9 | rv = sp.stats.rayleigh(loc=1) 10 | 11 | # (2)上記統計分布関数によるランダム変数の生成 12 | r = rv.rvs(size=3000) 13 | 14 | # (3)確率密度関数プロット用のパーセント点データ列 15 | x = np.linspace(rv.ppf(0.01), rv.ppf(0.99), 100) 16 | 17 | # 元の確率密度関数と一緒にサンプルしたデータの分布をプロットする 18 | plt.figure(1) 19 | plt.clf() 20 | plt.plot(x, rv.pdf(x), 'k-', lw=2, label='確率密度関数') 21 | plt.hist(r, normed=True, histtype='barstacked', alpha=0.5) 22 | plt.xlabel('値') 23 | plt.ylabel('分布度') 24 | plt.show() 25 | -------------------------------------------------------------------------------- /src/chapter9/filelist.txt: -------------------------------------------------------------------------------- 1 | p.278 : simple_2d.py 2 | p.280 : subplot_2x3.py 3 | p.280 : plt_gridspec.py 4 | p.282 : plt_in_plt.py 5 | p.283 : plt_contour.py 6 | p.286 : plt_3d.py 7 | 8 | -------------------------------------------------------------------------------- /src/chapter9/plt_3d.py: -------------------------------------------------------------------------------- 1 | from mpl_toolkits.mplot3d.axes3d import Axes3D 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | from matplotlib import cm 5 | from matplotlib.mlab import bivariate_normal 6 | 7 | # 2次元メッシュを作成 8 | N = 200 9 | x = np.linspace(-3.0, 3.0, N) 10 | y = np.linspace(-2.0, 2.0, N) 11 | X, Y = np.meshgrid(x, y) 12 | 13 | # 2変量正規分布で2次元分布データを作成 14 | z = 15 * (bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) - 15 | bivariate_normal(X, Y, 1.5, 0.5, 1, 1)) 16 | 17 | # データを3次元プロットする 18 | fig = plt.figure(1) # (1) 19 | ax = fig.add_subplot(111, projection='3d') # (2) 20 | surf = ax.plot_surface(X, Y, z, cmap=cm.gray) 21 | ax.set_zlim3d(-3.01, 3.01) 22 | plt.colorbar(surf, shrink=0.5, aspect=10) 23 | plt.show() 24 | -------------------------------------------------------------------------------- /src/chapter9/plt_contour.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | from matplotlib import cm 4 | from matplotlib.mlab import bivariate_normal 5 | 6 | # 2次元メッシュを作成 7 | N = 200 8 | x = np.linspace(-3.0, 3.0, N) 9 | y = np.linspace(-2.0, 2.0, N) 10 | X, Y = np.meshgrid(x, y) 11 | 12 | # 2変量正規分布で2次元分布データを作成 13 | z = 15 * (bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) - 14 | bivariate_normal(X, Y, 1.5, 0.5, 1, 1)) 15 | 16 | # --- プロットを作成 17 | plt.figure(1) 18 | 19 | # (1)zの値を濃淡の画像として表示 20 | im = plt.imshow(z, interpolation='bilinear', origin='lower', 21 | cmap=cm.gray, extent=(-3, 3, -2, 2)) 22 | 23 | # (2)等高線を表示 24 | levels = np.arange(-3, 2.5, 0.5) 25 | ctr = plt.contour(z, levels, colors='k', origin='lower', 26 | linewidths=2, extent=(-3, 3, -2, 2)) 27 | 28 | # (3)等高線にラベルをインライン表示 29 | plt.clabel(ctr, levels, inline=1, colors='black', 30 | fmt='%1.1f', fontsize=14) 31 | plt.show() 32 | -------------------------------------------------------------------------------- /src/chapter9/plt_gridspec.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import matplotlib.gridspec as gs 3 | import numpy as np 4 | 5 | G = gs.GridSpec(3, 3) # ← (1) 6 | 7 | axes_1 = plt.subplot(G[0, :]) # ← (2) 8 | plt.xticks([]), plt.yticks([]) 9 | plt.text(0.5, 0.5, '図枠1', ha='center', va='center', size=22) 10 | 11 | axes_2 = plt.subplot(G[1, :-1]) 12 | x = np.arange(-np.pi, np.pi, 0.1) 13 | y = np.sin(x) 14 | plt.plot(x, y) 15 | plt.text(-0.5, 0, '図枠2', ha='center', va='center', size=22) 16 | 17 | axes_3 = plt.subplot(G[1:, -1]) 18 | plt.xticks([]), plt.yticks([]) 19 | plt.text(0.5, 0.5, '図枠3', ha='center', va='center', size=22) 20 | 21 | axes_4 = plt.subplot(G[-1, 0]) 22 | plt.xticks([]), plt.yticks([]) 23 | plt.text(0.5, 0.5, '図枠4', ha='center', va='center', size=22) 24 | 25 | axes_5 = plt.subplot(G[-1, -2]) 26 | plt.xticks([]), plt.yticks([]) 27 | plt.text(0.5, 0.5, '図枠5', ha='center', va='center', size=22) 28 | 29 | plt.show() 30 | -------------------------------------------------------------------------------- /src/chapter9/plt_in_plt.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | 4 | # サブプロットを2つ並べる 5 | plt.figure(1) 6 | plt.subplot(2, 1, 1) 7 | x = np.arange(-np.pi, np.pi, 0.1) 8 | plt.plot(x, np.sin(x)) 9 | plt.subplot(2, 1, 2) 10 | plt.plot(x, np.cos(x)) 11 | 12 | # 図枠の中に図枠を設定 13 | plt.axes([0.55, 0.3, 0.3, 0.4]) 14 | plt.text(0.5, 0.5, 'axes([0.55, 0.3, 0.3, 0.4])', ha='center', va='center') 15 | plt.show() 16 | -------------------------------------------------------------------------------- /src/chapter9/simple_2d.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from numpy import sin, cos 3 | import matplotlib.pyplot as plt 4 | 5 | # (1)-πからπまで0.1刻みの配列をつくる 6 | x = np.arange(-np.pi, np.pi, 0.1) 7 | # 配列xに対してsin(x)を計算(sin()はユニバーサル関数) 8 | y1 = sin(x) 9 | # 配列xに対してcos(x)を計算 10 | y2 = cos(x) 11 | plt.figure(1) 12 | plt.clf() 13 | 14 | # x、yを描画 15 | plt.plot(x, y1, label='正弦関数') 16 | plt.plot(x, y2, 'r*', markersize=10, label='余弦関数') # (2) 17 | # 軸ラベル設定 18 | plt.xlabel('X軸') 19 | plt.ylabel('Y軸') 20 | # 凡例の描画 21 | plt.legend(loc='best') 22 | # (3)描画 23 | plt.show() 24 | -------------------------------------------------------------------------------- /src/chapter9/subplot_2x3.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | 3 | plt.figure(1), plt.clf() 4 | 5 | plt.subplot(2, 3, 1), plt.xticks([]), plt.yticks([]) 6 | plt.text(0.5, 0.5, 'subplot(2,3,1)', ha='center', va='center', size=25) 7 | plt.subplot(2, 3, 2), plt.xticks([]), plt.yticks([]) 8 | plt.text(0.5, 0.5, 'subplot(2,3,2)', ha='center', va='center', size=25) 9 | plt.subplot(2, 3, 3), plt.xticks([]), plt.yticks([]) 10 | plt.text(0.5, 0.5, 'subplot(2,3,3)', ha='center', va='center', size=25) 11 | plt.subplot(2, 3, 4), plt.xticks([]), plt.yticks([]) 12 | plt.text(0.5, 0.5, 'subplot(2,3,4)', ha='center', va='center', size=25) 13 | plt.subplot(2, 3, 5), plt.xticks([]), plt.yticks([]) 14 | plt.text(0.5, 0.5, 'subplot(2,3,5)', ha='center', va='center', size=25) 15 | plt.subplot(2, 3, 6), plt.xticks([]), plt.yticks([]) 16 | plt.text(0.5, 0.5, 'subplot(2,3,6)', ha='center', va='center', size=25) 17 | 18 | # プロット全体の表示 19 | plt.show() 20 | --------------------------------------------------------------------------------