NumPyの使い方(16) 行列matrix
NumPyのmatrixについて。
class | 種類 | 次元 |
---|---|---|
ndarray | 配列 | 次元は自由 |
matrix | 行列 | 2次元に固定 |
ndarrayでは行列の積を表すときにdot()を呼びだすが、
matrixでは「*」や「**」で行列の積などを表せる。
その他の使い方はndarrayと同様のようです。
import numpy as np a1 = np.array([[1, 2], [3, 4]]) a2 = np.array([[1, 1], [1, 1]]) print(a1 * a2) #同じ位置の要素どうしの積 # [[1 2] # [3 4]] print(a1.dot(a2)) # 内積 # [[3 3] # [7 7]] m1 = np.matrix([[1, 2], [3, 4]]) m2 = np.matrix([[1, 1], [1, 1]]) print(m1 * m2) # [[3 3] # [7 7]] print(m1 ** -1) # 逆行列(1) # [[-2. 1. ] # [ 1.5 -0.5]] print(m1.I) # 逆行列(2) # [[-2. 1. ] # [ 1.5 -0.5]] m3 = np.matrix([[1, 3], [-2, -4]]) P = (np.linalg.eig(m3))[1] # 正規化された固有ベクトルから作った対角化行列 print(P) # [[ 0.83205029 -0.70710678] # [-0.5547002 0.70710678]] PiAP = P.I * m3 * P # 対角化された行列 PiAP = PiAP.round(3) # 見やすくするため四捨五入 print(PiAP) # [[-1. 0.] # [-0. -2.]] print((PiAP)**2) # [[ 1. 0.] # [ 0. 4.]] print((PiAP)**3) # [[-1. 0.] # [-0. -8.]] # ndarrayでの内積の書き方 a3 = np.array(PiAP) print(PiAP.dot(PiAP).dot(PiAP).dot(PiAP)) # [[ 1. 0.] # [ 0. 16.]]
行列の積などを多用するプログラムのときはmatrixを用いると見やすく書けそう。
操作・演算 | ndarray | matrix |
---|---|---|
* | 対応要素の積 | 内積matrix product |
** | 各要素の2乗 | 行列の2乗 |
*-1 | 各要素の逆数 | 逆行列inverse |
I属性 | なし | 逆行列inverse |
H属性 | なし | 共役転置conjugate transpose |
matrixは2次元固定なので次元削減の操作にも一部違いがあります。
axisを指定したmean()だと、2次元(ndim=2)のままです。
m1 = np.matrix([5, 1]) print(m1) # [[5 1]] print(m1.shape) # (1, 2) print(m1.mean(1)) # [[3]] # 2次元のまま print(m1.mean(0)) # [[ 5. 1.]] print(m1.mean()) # 3.0
特にこだわりがなければ、matrixを使わずに、ndarrayだけで必要な操作ができるみたいです。