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.fft import *

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]