numpy
おドン
numpy
準備中
準備中
準備中

配列と行列

結論からいうと行列は使わずに, 配列を使うようにする.
配列arrayと行列matrixが存在する.
A = np.array([[1,2],[3,4]])
B = np.matrix([[1,2],[3,4]])
違いは, 行列計算に用いられる演算子.
S=(HVH^T)^(-1)
をndarrayを使って書くと,
S=inv(H.dot(V.dot(H.T))) #H,Vはarray
と少々読みにくいプログラムになる.
この問題を解決するために行列matrixが考案され,
S=inv(H*V*H.T) #H,Vはmatrix
また, arrayでもこのような記法ができるようになっており,
S=inv(H@V@H.T) #H,Vはarray
と表される.
これにより, matrixは使われなくなった.

リスト, タプルからarrayを作る

matA=np.array(リスト)
例) matA = np.array([[1,2],[3,4]])
matA=np.array(タプル)
例) matA= np.array((1,2),(3,4))

arange

python組み込み関数のrangeと似ている.
np.arange(10,20,2)
# => array(10,12,14,16,18)
#浮動小数も使える. stopを0.4など2進数で表せない値に設定すると0.4を含んでしまう恐れがあるので注意.

逆行列, 行列式, ランク

np.linalg.inv(A) #逆行列
np.linalg.det(A) #行列式
np.linalg.matrix_rank(A) #ランク

ベクトル

a,b=np.array([2,-4,1]), np.array([3,1,-2]) #定義
np.linner(a,b) #内積
np.cross(a,b) #外積

インデキシング(一部の要素を抜き取る)

基本インデキシング

ビューを生成する方法を基本インデキシングという.
コピーがメモリ上に作成されない. 変更が元のndarrayに反映される.
x2d=np.arange(12).reshape(3,4)
# => array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
x2d[0,2] # => 2 :要素(0,2)
b = x2d[1:,2:] # => array([[6,7],[10,11]]) 一行以降全てと2列以降全て.
b[:,:]=20 #bはビューなのでx2dも変更がされる.


- 主な基本インデキシング
b=a
b=a[:]
b=a[1:]
b=a.reshape((3,2))
b=np.reshape(a,(3,2))
b=np.array(a,copy=false)

応用インデキシング

変更が元の配列に反映されないコピーを作る.
- プール値インデキシング
dat = np.random.rand(2,3)
# => array([[0.324132, 0.23413, 0,2341312],[0.5231,0.61411,0,15311])
bmask = dat >0.5
array([[False, False, False],[True,True,False]])
highd=dat[bmask]
# => array([0.5231,0.61411]) #結果はベクトルになる
highd[0]=10 #datには変更が反映されない.

- 整数配列インデキシング
nda=np.arange(12).reshape(3,4)
ndb=nda([0,2,1],[2,0,3])
#(0,2),(2,0),(1,3)の位置の要素が取り出される.
ndb
# => array([2,8,7])

nda[np.ix_([0,2],[1,3])] #np.ix_関数は特定の行と列がクロスする位置の要素を取り出したいときに使う.
# => array([1,3],[9,11])


- 応用インデキシング
b=a[a>10] #プール池によるインデキシング
b=a[[1,2,4]] #整数配列による応用インデキシング
b=a[np.ix_([0,2],[3,4])] #ix_関数による応用インデキシング
b=a.copy() #コピーメソッド
b=np.copy(a) #コピー関数
b=np.clip(a,-0.1,0.1) #clip関数
b=a.flatten() #flattenメソッド

ufunc(ユニバーサル関数)

for文を極力使わない工夫
nda=np.arange(12).reshape(2,6)
np.square(nda) #全ての要素を2乗する.

python関数のufunc化

例) hex関数のufunc化
hex_array=np.frompyfunc(hex,1,1)
hex_array(np.array((10,30,100)))
これは以下と同じ
np.array((hex(10),hex(30),hex(100)))

frompyfunc関数の第一引数にはufunc化したいpython関数を第二引数にはそのpython関数の引数の数を第3引数にはufuncから戻されるオブジェクトの数を指定する.

ブロードキャスティング

要素毎に計算を行いたくても要素の数が異なるので, 本来はこのままでは実行できない.
numpyにおいてこの計算を可能にしてくれるのがブロードキャスティング.
ブロードキャストは足りない分をエクセルのドラッグのようにコピーしている感じ.
nda=np.array([1,2,3])
nda+1
# array([2,3,4])

nda=np.arange(24).reshape(4,3,2) #奥に4, (3,2)行列
ndb=np.arange(6).reshape(3,2)
ndc=np.arange(3).reshape(3,1)
nda+ndb-ndc

nda=np.arange(12).reshape(3,4)
ndb=np.arange(4)
nda+ndb
# [[0,1,2,3], [[0,1,2,3],
# [4,5,6,7], + [0,1,2,3],
# [8,9,10,11]] [0,1,2,3]]
Copyright (C) 2017 Odon Laboratry  All Rights Reserved.