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

Python

はじめに

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

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**2
array([[ 1,  4],
       [ 9, 16]])
>>> np.power(A,2)
array([[ 1,  4],
       [ 9, 16]])

転置

>>> 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]のようにスライシングを利用した反転は他のツール、言語でも可能だが、書き方異なる。
start:end:step → Python
start:step:end → MATLAB等

まとめ

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

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

ポイント

  • 環境構築不要
    • ブラウザだけで学習を始められる。
  • 申し込みから4ステップで登録を完了
    • 申し込み完了待ちとかない。すぐ始められる。
  • 1,000問以上の実践的な課題がある。

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

コメント

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