*SJS2016 ex03 [#f69bd8f1] 課題いっぱいありますが,1回で全部終わらせようという意図ではありません. 自分で進められるひとはどんどん先へ進めたらよいですが. #contents **前回分と今回分 [#kbc5dcd1] - できたひとは,課題ごとに高橋に報告してください.それぞれのプログラムを実行すると何がどうなっているのか説明できるようにしておいてください. - 前回分を全て報告してokをもらってから,今回分にすすみましょう. **課題A [#w83b99ab] Python で関数 ***課題A-1 [#w2aaa57d] - 以下のプログラムを実行し,何が起こっているのか理解しなさい.コメント行になっているところは,コメントをはずして実行するとエラーが出ます.どんなエラーが出るのか試してみよう.なぜエラーになるのか考えよう. #pre{{ def func1(x): x = 3 print(x) def func2(x): return x + 1 def func3(x): x[0] = 'hoge' x.append('fuga') print(x) if __name__ == '__main__': y = [ 1, 'a', [ 10, 20, 30 ], -1 ] z = 999 func1(y) print('y = ', y) func1(z) print('z = ', z) #yy = func2(y) # ERROR! #print('yy = ', yy) zz = func2(z) print('zz = ', zz) func3(y) print('y = ', y) #func3(z) # ERROR! #print('z = ', z) }} ***課題A-2 [#cab595df] 上記に次の関数定義を追加しよう. #pre{{ def func4(x, a = 999, msg = 'hogege'): print(msg, x + a) }} そして,次のように呼び出してみよう. #pre{{ func4(1) func4(1, a = 0) func4(2, msg = 'nyanya') func4(3, msg = 'nyanya', a = -2) #func4(a = 999, 4) #ERROR! }} ここで登場しているのは,「キーワード引数」というものである.詳しくは書籍等を参照.キーワード引数は順序を気にしなくてよい(最後の例のような場合はNG). **課題B [#q4781790] モジュールと import ***課題B-1 [#kdcf8ccd] 課題Aのプログラムを hoge.py という名前で保存していたとする.このとき,同じディレクトリ内に次の内容のプログラム fuga.py を作成し,実行してみよう. #pre{{ import hoge def func1(): print('Hoge?') if __name__ == '__main__': func1() hoge.func1(999) hoge.func3( [ 1, 'a', [ 10, 20, 30 ], -1 ] ) }} ***課題B-2 [#t153f07d] hoge.py の最初の方に1行追加して #pre{{ hogefuga = { 1:'Hoge', 2:'Fuga', 3:'Hena' } def func1(x): : }} のようにすると,「モジュール名.変数名」という形でこの変数 hogefuga を次のように fuga.py の方から参照できる. #pre{{ for i in range(1, 4): print(i, hoge.hogefuga[i]) }} ただし,ipython 上で %run fuga.py のように実行している場合,そのままでは hoge.py の修正が再読込されないので,次のようにしてやる必要がある. #pre{{ In [20]: reload(hoge) Out[20]: <module 'hoge' from 'hoge.py'> In [21]: %run fuga.py }} ***課題B-3 [#fa0e0753] fuga.py 中の import 文を import hoge as nya と書き換えたら,main の方はどう修正したらよいだろう? **課題C [#r2dad673] NumPy 入門 #pre{{ import numpy as np A = np.array( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] ) print(A) print(A.shape, A.dtype) print() B = np.array( [ [ 1, 2, np.pi ], [ 4, 5, 6 ] ] ) print(B) print(B.shape, B.dtype) print() A[0,1] = np.exp(1) B[0,1] = np.exp(1) print(A) print(B) print() print(B**2) print(np.log(B)) print() C = A + B print(C, C.shape, C.dtype) print() vec = np.arange( 1, 21 ) print(vec, vec.shape, vec.dtype) print() mat = np.reshape( vec, ( 4, 5 ) ) print(mat, mat.shape) print() print(mat.T, mat.T.shape) print() mat[1, 1] *= 111 print(mat) print(vec) print() X = mat[:2,2:4] print(X) print() Y = X - 2 print(Y) Z = X * Y print(Z) Z = np.dot( X, Y ) print(Z) }} **課題D [#vcf9bde7] [[PIP/2016]] 第12回講義資料の Q1 を NumPy を利用して解いてみよう. ***課題D-1 [#v3f2880f] まずは手計算を併用して解いてみよう.式(11)を &mathjax{ A\mathbf{x} = \mathbf{b} }; という形で表すことにする. + 2 x 2 行列 &mathjax{ A }; と 2 x 1 行列(2次元ベクトル) &mathjax{ \mathbf{b} }; を手計算で求めなさい + NumPy で,&mathjax{ A }; と &mathjax{ \mathbf{b} }; を与えて連立方程式 &mathjax{ A\mathbf{x} = \mathbf{b} }; の解 &mathjax{ \mathbf{x} }; を計算する方法を調べなさい + 実際に解 &mathjax{ \mathbf{x} }; すなわちパラメータ a, b の値を求め,連立方程式を手計算で解いた場合と同じになることを確認しなさい. ***課題D-2 [#m971fc4d] 以下が何をやっているか理解し,これに連立方程式を解く部分を追加しなさい. #pre{{ import numpy as np xorg = np.array( [ 4.0, 5.0, 6.0, 9.0 ] ) yorg = np.array( [ 30.0, 31.0, 29.0, 28.0 ] ) xvec = xorg - xorg[0] yvec = yprg - yorg[0] xvec = np.array( [ 0.0, 1.0, 2.0, 5.0 ] ) yvec = np.array( [ 0.0, 1.0, -1.0, -2.0 ] ) X = np.vstack( ( xvec, np.ones_like(xvec) ) ) print(X, X.shape) Y = yvec print(Y, Y.shape) A = np.dot( X, X.T ) print(A) b = np.dot( X, Y ) print(b) }}