Pythonで行列処理2
1か月ぶりの更新ですね
Pythonでの行列はNumpyライブラリで大方のことはできるようだ。手持ちのデータだと内積を使う機会が多いかな。
自分が相手をするデータで処理方法が決まるし、慣れていない処理はどうしでもコードが思いつかない。
仕方ないとはいえ、忘れてしまうのももったいないし、新しい言語を覚える機会で思い出すのは良いことですね。
import numpy as np
ドット積(点乗積)
a = np.array(range(4),np.int32) #array([0,1,2,3]) b = a-3 #array([-3,-2,-1,0]) np.dot(a,b) #0*2+1*(-2)+2*(-1)+3*0
-4
[tex:
a=(a_1,a_2)
,
b=(b_1,b_2)
]
[tex: (a \cdot b)=a_1b_1+a_2b_2 ]
a = [[1,2],[5,2]] b = [[4,3],[2,1]] np.dot(a,b) #行列の掛け算
array([[ 8, 5],
[24, 17]])
[tex: a= \begin{pmatrix} a_1&a_2\ a_3&a_4 \end{pmatrix} ] , $ b= \begin{pmatrix} b_1&b_2\ b_3&b_4 \end{pmatrix} $
$ (a \cdot b)= \begin{pmatrix} a_1 b_1+a_2 b_3 & a_1 b_2+a_2 b_4\ a_3 b_1+a_4 b_3 & a_2 b_2a_4 b_4 \end{pmatrix} $
内積(スカラー積)
$ a \cdot b $
a = np.array(range(4),np.int32) #array([0,1,2,3]) b = np.array(range(3,7),np.int32) #array([3,4,5,6]) np.inner(a,b) #0*3+1*4+2*5+3*6
32
$
a=(a_1,a_2)
$
,
$
b=(b_1,b_2)
$
$ a \cdot b=a_1b_1+a_2b_2 $
a = [[1,2],[5,2]] b = [[4,3],[2,1]] np.inner(a,b)
array([[10, 4],
[26, 12]])
$ a= \begin{pmatrix} a_1&a_2\ a_3&a_4 \end{pmatrix} $ , $ b= \begin{pmatrix} b_1&b_2\ b_3&b_4 \end{pmatrix} $
$ a \cdot b= \begin{pmatrix} a_1 b_1+a_2 b_3 & a_1 b_2+a_2 b_4\ a_3 b_1+a_4 b_3 & a_3 b_2+a_3 b_4 \end{pmatrix} $
外積(ベクトル積)
$ a \times b\ $
a = np.array(range(4),np.int32) #array([0,1,2,3]) b = np.array(range(3,7),np.int32) #array([3,4,5,6]) np.outer(a,b)
array([[ 0, 0, 0, 0],
[ 3, 4, 5, 6],
[ 6, 8, 10, 12],
[ 9, 12, 15, 18]])
$
a=(a_1,a_2)
$
,
$
b=(b_1,b_2)
$
$ a \times b= \begin{pmatrix} a_1 b_1 & a_1 b_2 & a_1 b_3 & a_1 b_4\ a_2 b_1 & a_2 b_2 & a_2 b_3 & a_2 b_4\ a_3 b_1 & a_3 b_2 & a_3 b_3 & a_3 b_4\ a_4 b_1 & a_4 b_2 & a_4 b_3 & a_4 b_4 \end{pmatrix} $
a = [[1,2],[5,2]] b = [[4,3],[2,1]] np.outer(a,b)
array([[ 4, 3, 2, 1],
[ 8, 6, 4, 2],
[20, 15, 10, 5],
[ 8, 6, 4, 2]])
$ a= \begin{pmatrix} a_1&a_2\ a_3&a_4 \end{pmatrix} $ , $ b= \begin{pmatrix} b_1&b_2\ b_3&b_4 \end{pmatrix} $
$ a \times b= \begin{pmatrix} a_1 b_1 & a_1 b_2 & a_1 b_3 & a_1 b_4\ a_2 b_1 & a_2 b_2 & a_2 b_3 & a_2 b_4\ a_3 b_1 & a_3 b_2 & a_3 b_3 & a_3 b_4\ a_4 b_1 & a_4 b_2 & a_4 b_3 & a_4 b_4 \end{pmatrix} $
転置行列
a = np.array([[1,2],[5,2]],np.int32) #arrayの型 a.T
array([[1, 5],
[2, 2]])
行列式
np.linalg.det(a) #linalgはNumPyの一部、"from linalg import numpy as .."でも可
-7.9999999999999982
逆行列
np.linalg.inv(a)
array([[-0.25 , 0.25 ],
[ 0.625, -0.125]])
np.dot(a,np.linalg.inv(a)) #検算、単位行列になる
array([[ 1., 0.],
[ 0., 1.]])
固有ベクトル
x,y=np.linalg.eig(a) #帰り値の1つ目(x)が固有値、2つ目(y)が固有ベクトル
x
array([-1.70156212, 4.70156212])
y
array([[-0.59500525, -0.47536171],
[ 0.80372182, -0.87979045]])
ノルム長
np.linalg.norm(a)
5.8309518948453007
零行列
np.zeros(4) #長さが4の零行列
array([ 0., 0., 0., 0.])
np.zeros([2,4]) #2x4の零行列
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
単位行列
np.identity(4) #より高度な操作ができる"np.eye"でも可
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])