Hatena::ブログ(Diary)

Pashango’s Blog このページをアンテナに追加 RSSフィード

2009-07-14

高速数値計算ライブラリ「Numpy」覚書き

Pythonで一番有名で普及しているライブラリと言っても過言ではない「Numpy」の覚書きです。かなり多機能な数値計算ライブラリで、内部はC言語で記述されているため超高速に動作します。

ベクトル

ベクトルの長さ&正規化
import numpy
a = numpy.array([[2,2]])

#ベクトルの長さ
length = numpy.linalg.norm(a)
#length=>2.8284271247461903

#ベクトルの正規化
a / numpy.linalg.norm(a)
#=>array([[ 0.70710678,  0.70710678]])
内積&外積
import numpy
v1 = numpy.array((1,0,0))
v2 = numpy.array((0,1,0))

#内積
numpy.dot(v1,v2)    #=> 0
#外積
numpy.cross(v1,v2)  #=>[0 0 1] 

一般的には2次元の外積の存在は賛否が分かれる所ですが、numpyでは2次元ベクトルの外積が用意されています。

import numpy

numpy.cross([0,1],[ 1,0]) #-1
numpy.cross([0,1],[-1,0]) # 1
numpy.cross([1,0],[ 0,1]) # 0

内積を90度回転させた感じですね、左右の正と負の領域判定に使えそうです。

行列

単位行列の定義
import numpy
I = numpy.matrix(numpy.identity(3))
#[[ 1.  0.  0.]
# [ 0.  1.  0.]
# [ 0.  0.  1.]]
転置
import numpy
a = numpy.matrix([[1,2],[3,4]])
# [[1, 2],
#  [3, 4]]

a.T
# [[1, 3],
#  [2, 4]]
逆行列&行列式
import numpy
a = numpy.matrix([[3,1], [1,2]])

#逆行列
a.I
#[[ 0.4, -0.2],
# [-0.2,  0.6]]

#行列式
numpy.linalg.det(a)
# 5.0
回転行列
import python
from numpy import sin,cos
r = numpy.pi/2.

#2次元回転
numpy.matrix( (
    ( cos(r), sin(r)),
    (-sin(r), cos(r))
) )

#3次元z軸回転
numpy.matrix( (
    ( cos(r), sin(r), 0.),
    (-sin(r), cos(r), 0.),
    (     0.,     0., 1.)
) )

#3次元x軸回転
numpy.matrix( (
    ( 1.,     0.,     0.),
    ( 0., cos(r), sin(r)),
    ( 0.,-sin(r), cos(r))
) )

#3次元y軸回転
numpy.matrix( (
    ( cos(r), 0.,-sin(r)),
    (     0., 1.,     0.),
    ( sin(r), 0., cos(r))
) )
行列とベクトルの積
import numpy
#行列
mat = numpy.matrix( (
    (2.0, 0.0, 10),
    (0.0, 3.0, 10),
) )
#ベクトル
vec = numpy.array( (2.0,2.0, 1.0) )

#行列とベクトルの積
numpy.dot(mat,vec)
#[ 14.  13.]
固有値・固有ベクトル&対角化

固有値、固有ベクトルは以下の式が成り立つベクトルとスカラ

A*v = λ*v(λ=Aの固有値,v=Aの固有ベクトルとする)

行列の対角化(diagonal)とは、正方行列Aに対して対角化された行列をPとすると、

P^-1 * A * P = 対角要素が固有値の行列

(P^-1はPの逆行列を表す)

となる行列である。

なお、numpy.diagonal()は対角化する関数ではなく、単に行列の対角要素をベクトルとして返す関数なので注意。

import numpy
A = numpy.array([[5,-2],[-4,7]])
(l,v) = numpy.linalg.eig( A )
#l=>[ 3.,  9.]
#v=>[[-0.70710678,  0.4472136 ],
#    [-0.70710678, -0.89442719]]

その他

平均値&標準偏差
import numpy
pop = [79,81,77,78,83,80,82,78,80,82]

#平均
numpy.mean(pop)  #=>80.0
#標準偏差
numpy.std(pop)   #=>1.8973665961010275
相関係数&相関係数行列
import numpy
a = [1,2,3,4,5]
b = [1,1,3,5,5]
c = [5,4,3,1,1]
d = [-1,3,-4,5,-5]

#aとbの相関係数
numpy.corrcoef(a,b)[0][1] #=> 0.948683298051
#aとcの相関係数
numpy.corrcoef(a,c)[0][1] #=> -0.972271824132
#aとdの相関係数
numpy.corrcoef(a,d)[0][1] #=> -0.218797487247

#a,b,c,dの相関係数行列
numpy.corrcoef([a,b,c,d])
#[[ 1.          0.9486833  -0.97227182 -0.21879749]
# [ 0.9486833   1.         -0.97827974 -0.1153164 ]
# [-0.97227182 -0.97827974  1.          0.01933915]
# [-0.21879749 -0.1153164   0.01933915  1.        ]]
高速フーリエ変換(FFT)
import numpy
t = numpy.arange(0.0, 2*numpy.pi, 2*numpy.pi/32)
c = numpy.cos(t)
C = numpy.fft.fft(c)

peroonperoon 2010/08/01 23:43 参考になりました。ありがとうございます!

#3次元y軸回転
一部、マイナスが余分ですよっ!

pashango_ppashango_p 2011/03/09 00:19 peroonさん

ご指摘ありがとうございます、修正しておきました。

知床知床 2012/01/15 00:17 >行列の対角化(diagonal)とは、正方行列Aに対して対角化された行列をPとすると、(略)となる行列である。
主述が一致していませんよ。

RyuichiXPRyuichiXP 2014/04/10 10:02 はじめまして。最近numpyで二元一次連立方程式を解いていて、ここを参考にさせて頂きました。
又なんか有りましたらよろしくお願いします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証