【入門】Pythonの行列演算【数値計算】

Python
スポンサーリンク

はじめに

※ MATLAB、Python、Scilab比較ページはこちら。

Pythonに於ける行列演算の備忘録。
Python自体は行列演算をする機能は無いが、NumPyにより可能となっている。
さほどPythonで行列演算をすることは無く、基本的には行列から行ベクトルを抜き出して、ベクトルとして演算することがほとんど。
であるが故に、たまに使おうと思うと大ハマりすることも多い。

前提

\[A=
\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}
\]
\[B=
\begin{bmatrix}
5 & 6 \\
7 & 8
\end{bmatrix}
\]

>>> A=np.array([[1,2], [3,4]])
>>> B=np.array([[5,6], [7,8]])
>>> A
array([[1, 2],
       [3, 4]])
>>> B
array([[5, 6],
       [7, 8]])
>>>   

足し算

>>> A+B
array([[ 6,  8],
       [10, 12]])

引き算

>>> A-B
array([[-4, -4],
       [-4, -4]])

掛け算

>>> A@B
array([[19, 22],
       [43, 50]])
       
>>> A.dot(B)
array([[19, 22],
       [43, 50]])
       
>>> np.matmul(A,B)
array([[19, 22],
       [43, 50]])

A*Bだとアダマール積になる。

>>> A*B
array([[ 5, 12],
       [21, 32]])

数学におけるアダマール積(英: Hadamard product)は、同じサイズの行列に対して成分ごとに積を取ることによって定まる行列の積である。要素ごとの積(英: element-wise product)、シューア積(英: Schur product)、点ごとの積(英: pointwise product)、成分ごとの積(英: entrywise product)などとも呼ばれる。

Wikipediaより

左除算

Pythonでは直接、左除算はできない。
よって、逆行列との積で除算とする。

>>> np.linalg.inv(A)@B
array([[-3., -4.],
       [ 4.,  5.]])

>>> np.linalg.inv(A).dot(B)
array([[-3., -4.],
       [ 4.,  5.]])

>>> np.matmul( np.linalg.inv(A), B )
array([[-3., -4.],
       [ 4.,  5.]])

右除算

Pythonでは直接、右除算はできない。
よって、逆行列との積で除算とする。

>>> A@np.linalg.inv(B)
array([[ 3., -2.],
       [ 2., -1.]])

>>> A.dot(np.linalg.inv(B))
array([[ 3., -2.],
       [ 2., -1.]])

>>> np.matmul( A, np.linalg.inv(B) )
array([[ 3., -2.],
       [ 2., -1.]])

べき乗

>>> A@A
array([[ 7, 10],
       [15, 22]])
>>> np.linalg.matrix_power(A, 2)
array([[ 7, 10],
       [15, 22]])

転置

>>> A.T
array([[1, 3],
       [2, 4]])
>>> A.transpose()
array([[1, 3],
       [2, 4]])

反転

一次元目(縦方向)に対して反転。

>>> np.flipud(A)
array([[3, 4],
       [1, 2]])
>>> A[::-1]
array([[3, 4],
       [1, 2]])

ニ次元目(横方向)に対して反転。

>>> np.fliplr(A)
array([[2, 1],
       [4, 3]])
>>> A[:,::-1]
array([[2, 1],
       [4, 3]])

flipudのudはUpDownの略。
fliplrのlrはleftRightの略。

A[::-1]、A[:,::-1]のようにスライシングを利用した反転はNumPyならではの手法であり、画像の反転等で利用されることが多い。

まとめ

MATLABと似ているようで似ていないが、一応同様のことはできる。
逆順のスライシングなどはNumPy独特の記載法ではあるが、結構使い勝手は良い。
その反面、MATLABに移植する際に混乱をきたすこともあるので、MATLABでの記載方法と合わせて覚えて負うことが吉。

Pythonをガッツリ学習したい場合はオンライン学習サービスなどもあります。
オンラインPython学習サービス「PyQ(パイキュー)」公式ページ

※ MATLAB、Python、Scilab比較ページはこちら。

コメント

タイトルとURLをコピーしました