日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

Pythonで行列処理2

1か月ぶりの更新ですね
Pythonでの行列はNumpyライブラリで大方のことはできるようだ。手持ちのデータだと内積を使う機会が多いかな。
自分が相手をするデータで処理方法が決まるし、慣れていない処理はどうしでもコードが思いつかない。
仕方ないとはいえ、忘れてしまうのももったいないし、新しい言語を覚える機会で思い出すのは良いことですね。

import numpy as np

ドット積(点乗積)


(a \cdot b)

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.]])