2007年7月5日木曜日

SciPyの使い方: 行列演算

このブログ記事をはてなブックマークに追加

PythonのモジュールであるSciPyを使った行列演算を示す。scipy.linalgではBLASやLAPACKを利用しているので、高速な演算が可能になっている。

>>> from scipy import * >>> a = [[1, 3, 5], [2, 5, 1], [2, 3, 8]] # リスト >>> A = mat(a) # リスト→行列 >>> A.tolist() # 行列→リスト [[1, 3, 5], [2, 5, 1], [2, 3, 8]] >>> A # 行列 matrix([[1, 3, 5], [2, 5, 1], [2, 3, 8]])

>>> A.I # 逆行列 matrix([[-1.48, 0.36, 0.88], [ 0.56, 0.08, -0.36], [ 0.16, -0.12, 0.04]]) >>> A.H # エルミート行列 matrix([[1, 2, 2], [3, 5, 3], [5, 1, 8]]) >>> A.T # 転置行列 matrix([[1, 2, 2], [3, 5, 3], [5, 1, 8]]) >>> A.A # 行列→配列 array([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) >>> A.A1 # 行列→1次元配列 array([1, 3, 5, 2, 5, 1, 2, 3, 8]) >>> A[1] # 2番目の行を取り出す matrix([[2, 5, 1]]) >>> A.T[1] # 2番目の列を取り出す matrix([[3, 5, 3]]) >>> A.conj() # 共役行列 matrix([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) >>> A.diagonal() # 対角化 matrix([[1, 5, 8]]) >>> linalg.det(A) # 行列式 -25.000000000000004 >>> linalg.eig(A) # 固有値と固有ベクトル (array([ 10.5540456 +0.j, -0.5873064 +0.j, 4.03326081+0.j]), array([[-0.51686204, -0.94195144, 0.11527992], [-0.32845853, 0.31778071, -0.81936883], [-0.79054957, 0.10836468, 0.56155611]])) >>> linalg.norm(A) # 正規化 11.916375287812984 >>> linalg.lu(A) # LU分解 (array([[ 0., 1., 0.], [ 0., 0., 1.], [ 1., 0., 0.]]), array([[ 1. , 0. , 0. ], [ 1. , 1. , 0. ], [ 0.5 , -0.25, 1. ]]), array([[ 2. , 5. , 1. ], [ 0. , -2. , 7. ], [ 0. , 0. , 6.25]])) >>> linalg.qr(A) # QR分解 (array([[-0.33333333, -0.52297636, -0.78446454], [-0.66666667, -0.45760432, 0.58834841], [-0.66666667, 0.7190925 , -0.19611614]]), array([[-3. , -6.33333333, -7.66666667], [ 0. , -1.69967317, 2.68025385], [ 0. , 0. , -4.90290338]])) # 四則演算 >>> A + A matrix([[ 2, 6, 10], [ 4, 10, 2], [ 4, 6, 16]]) >>> A - A matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) >>> A * A matrix([[17, 33, 48], [14, 34, 23], [24, 45, 77]]) >>> A / A matrix([[1, 1, 1], [1, 1, 1], [1, 1, 1]]) >>> A * A.I matrix([[ 1.00000000e+00, 0.00000000e+00, 8.32667268e-17], [ -1.66533454e-16, 1.00000000e+00, 1.94289029e-16], [ -4.44089210e-16, 1.11022302e-16, 1.00000000e+00]])

0 コメント: