Remrinのpython攻略日記

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

NumPyの使い方(11) 行列計算

NumPyの行列計算について
 

内積

内積はnp.dot()関数を使うかarray.dot()メソッドを使うか。
内積は順序によって結果が異なる。

import numpy as np

a1 = np.ones([2, 2], dtype=int)
a2 = np.arange(1, 5).reshape(2, 2)

print(a1)
# [[1 1]
#  [1 1]]

print(a2)
# [[1 2]
#  [3 4]]

# 行列の内積(1)
print(np.dot(a1, a2))
# [[4 6]
#  [4 6]]

# 行列の内積(1)
print(a1.dot(a2))
# [[4 6]
#  [4 6]]

# 行列の内積(3)
print(np.dot(a2, a1))
# [[3 3]
#  [7 7]]

 

線形代数関数

numpy.linalgライブラリに線形代数の関数がある。
 

array.T 転置行列
diag 正方行列の対角成分を抜き出す。また、1次元配列からはそれを対角成分とする正方行列を作る。
dot 内積
cross 外積
trace 対角成分の和
linalg.norm ノルム。ベクトルの長さ
linalg.det 行列式
linalg.eig 固有値と固有行列
linalg.inv 逆行列
pinv 疑似逆行列
qr QR分解
svd 特異値分解
linalg.solve 連立方程式を解く
lstsq 最小二乗法

 

a1 = np.array([[1, 2],[3, 4]])
print(a1)
# [[1 2]
#  [3 4]]

# 転置行列
print(a1.T)
# [[1 3]
#  [2 4]]

# 対角成分
print(np.diag(a1))  # [1 4]
print(np.diag([1, 2, 3, 4, 5]))
# [[1 0 0 0 0]
#  [0 2 0 0 0]
#  [0 0 3 0 0]
#  [0 0 0 4 0]
#  [0 0 0 0 5]]

# trace
print(np.trace(a1))      # 5

# 行列式     
print(np.linalg.det(a1)) # -2.0

# 固有ベクトルと固有値
print(np.linalg.eig(a1))
# (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
#        [ 0.56576746, -0.90937671]]))

# 逆行列
print(np.linalg.inv(a1))
# [[-2.   1. ]
#  [ 1.5 -0.5]]

# 連立方程式 x+2y=5, 3x+4y=13を解く
print(np.linalg.solve(a1, [5, 13])) # [3. 1. ] x=3, y=1