Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

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だけで必要な操作ができるみたいです。