NumPyを使ってみる
Windows, Python2.6, 2010/3/8の話題。
NumPyはPythonの数値計算ライブラリです。
http://new.scipy.org/download.htmlからダウンロードできます。
SourceForge site for NumPyからnumpy-1.3.0-win32-superpack-python2.6.exeをダウンロード
特に設定なしにインストールできます。
以下使い方のメモです。
配列オブジェクト
配列をベクトルとして使います。
"*"は内積ではなく、要素ごとの積をとったベクトルなので注意
from numpy import * u = array( [ 1, 2, 3 ] ) print u v = arange( 3 ) #[ 0, 1, 2 ] print v print u + v print u * v print "---" print dot(u,v) #内積 print cross(u,v) #外積 print linalg.norm(v) #ノルム(長さ)
[1 2 3]
[0 1 2]
[1 3 5]
[0 2 6]
-
- -
8
[ 1 -2 1]
2.2360679775
要素へのアクセス
特定の要素へのアクセスには[:]を使います
u = array( [ 1, 2, 3, 4 ] ) print u[2] print u[1:] u[1:3] = 9, 8 #1と3の間の要素を修正 print u
3
[2 3 4]
[1 9 8 4]
行列としての配列オブジェクト
行列のように形を整形することもできるみたいです
A = array([[1., 0., 0., 5.], [0., 2., 4., 0.], [3., 0., 0., 5.]]) print A print "---" print A[0] print A[1:3]
[ [ 1. 0. 0. 5.]
[ 0. 2. 4. 0.]
[ 3. 0. 0. 5.] ]
-
- -
[ 1. 0. 0. 5.]
[ [ 0. 2. 4. 0.]
[ 3. 0. 0. 5.] ]
B = array( [ (cos(pi/3),sin(pi/3)), (-sin(pi/3),cos(pi/3)) ] ) print B
[ [ 0.5 0.8660254]
[-0.8660254 0.5 ] ]
配列オブジェクトの整形
整形用のメンバとしてshape,reshapeなどがある模様
A = arange(6) A.shape = 3,2 print A print A.shape
[ [0 1]
[2 3]
[4 5] ]
(3, 2)
配列オブジェクトを行列として計算する
演算子や関数がいろいろ用意されているので、行列計算には注意が必要みたいです。
A = array( [[1/sqrt(2),1/sqrt(2)], [-1/sqrt(2),1/sqrt(2)]] ) B = array( [[1/sqrt(2),-1/sqrt(2)], [1/sqrt(2),1/sqrt(2)]] ) print A*B #要素ごとの積 print dot(A,B) #行列の積として計算
[ [ 0.5 -0.5]
[-0.5 0.5] ]
[ [ 1. 0.]
[ 0. 1.] ]
そもそもarrayとmatrixは別物のようです。matrix型が用意してあります。
配列A→行列への変換はmat(A)
matrixオブジェクトを利用するにはfrom numpy import matrix
行列計算
matrix型を利用した計算です。ベクトルはmatrix型として考えます。
from numpy import matrix A = matrix( [[1,0,1],[-1,1,-1],[1,0,2]] ) x = matrix( [[0],[1],[2]] ) #列ベクトル y = matrix( [[0,1,2]] ) #行ベクトル print A print x print y print "----" print A*x #ベクトルとの積 print "----" print A.I #逆行列 print "----" print A.T #転置 print "----" print A.trace() #トレース
[ [ 1 0 1]
[-1 1 -1]
[ 1 0 2] ]
[ [0]
[1]
[2] ]
[ [0 1 2] ]
-
-
- -
-
[ [ 2]
[-1]
[ 4] ]
-
-
- -
-
[ [ 2. 0. -1.]
[ 1. 1. 0.]
[-1. 0. 1.] ]
-
-
- -
-
[ [ 1 -1 1]
[ 0 1 0]
[ 1 -1 2] ]
-
-
- -
-
[ [4] ]
線形代数
from numpy import linalg A = matrix( [[1,0,1],[-1,1,-1],[1,0,2]] ) x = matrix( [[0],[1],[2]] ) print linalg.solve(A, x) #線形1次方程式の解. print "---" A = matrix( [[1,0,0],[-3,3,3],[0,1,5]] ) (eigenValues,eigenVectors)=linalg.eig(A) #固有値の組,固有ベクトルの組 print eigenValues print eigenVectors
[ [-2.]
[ 1.]
[ 2.] ]
-
- -
[ 6. 2. 1.]
[ [ 0. 0. 0.37476584]
[ 0.70710678 0.9486833 0.89943803]
[ 0.70710678 -0.31622777 -0.22485951] ]より本格的な機能を求めるならSciPyを入れるのがよさそう。
FFT
from numpy import * from numpy.fft import * inputSignal = array([2., 0., -1., -5., -3., -2., -1., 1.]) #複素数OK fourier = fft(inputSignal) print fourier print ifft(fourier)
[ -9.00000000+0.j 10.65685425+2.82842712j 1.00000000-2.j
-0.65685425+2.82842712j 3.00000000+0.j -0.65685425-2.82842712j
1.00000000+2.j 10.65685425-2.82842712j]
[ 2.00000000e+00 +0.00000000e+00j 1.33226763e-15 +1.07960685e-15j
-1.00000000e+00 +0.00000000e+00j -5.00000000e+00 +6.96749985e-16j
-3.00000000e+00 +0.00000000e+00j -2.00000000e+00 -2.52660775e-16j
-1.00000000e+00 +0.00000000e+00j 1.00000000e+00 -1.52369606e-15j]