NumPy入門 基本的な線形代数計算 その2 転置・トレース・逆行列・行列式

今回は逆行列、転置、トレース、行列式の取得方法について学習します。

転置、トレースはndarrayオブジェクトのメソッドやプロパティで算出することができます。

逆行列、行列式は前回使用したlinalgを使用します。

転置

プロパティTで行列の転置を取得することができます。いくつかのサンプルで確認してみましょう。

import numpy as np

a = np.array([1, 2, 3])
a.T
# array([1, 2, 3])

b = np.array([[1], [2], [3]])
# array([[1],
#        [2],
#        [3]])

b.T
# array([[1, 2, 3]])

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

c.T
# array([[1, 3],
#        [2, 4]])
# 

トレース

行列の対角成分の和をトレースと呼びます。トレースの算出はtraceメソッドを使用します。

import numpy as np

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

a.trace()
# 5
# 

(蛇足な気もしますが)、一般的には正方行列のみに定義されるトレース、numpyでは1,1成分から斜めに行けるところまで計算します。例外を期待した実装をすると問題を見過ごしてしまうかもしれません。

import numpy as np

b = np.array([[1, 2, 3], [4, 5, 6]])
# array([[1, 2, 3],
#        [4, 5, 6]])

b.trace()
# 6


c = np.array([[1, 2], [3, 4], [5, 6]])
# array([[1, 2],
#        [3, 4],
#        [5, 6]])
# 

c.trace()
# 5
# 

逆行列

linalg.invメソッドで逆行列を求めることができます。

import numpy as np

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

a_inv = np.linalg.inv(a)
# array([[-2. ,  1. ],
#        [ 1.5, -0.5]])

# 検算してみる
np.dot(a, a_inv)
# array([[  1.00000000e+00,   1.11022302e-16],
#        [  0.00000000e+00,   1.00000000e+00]])
# 

最後の計算で行列の積で単位行列になることを確認していますが誤差が発生しています。

行列式

行列式はlinalg.detで求めることができます。

import numpy as np
a = np.array([[1, 2], [3, 4]])
# array([[1, 2],
#        [3, 4]])


det_a = np.linalg.det(a)
# -2.0000000000000004

1 * 4 - 2 *3 = -2なのでほぼ正しい値が取得できていることが確認できます。