※記事内に商品プロモーションを含むことがあります。
はじめに
NumPy配列の四則演算と線形代数学の演算について。
環境
基本的な四則演算
NumPy配列同士の四則演算は、Pythonにおける通常の四則演算と同様に行える。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6],[7,8]])
>>> a+b # 足し算
array([[ 6, 8],
[10, 12]])
>>> b-a # 引き算
array([[4, 4],
[4, 4]])
>>> a*b # 要素ごとの掛け算
array([[ 5, 12],
[21, 32]])
>>> b/a # 要素ごとの割り算
array([[ 5. , 3. ],
[ 2.33333333, 2. ]])
>>> b%a # 要素ごとの剰余
array([[0, 0],
[1, 0]], dtype=int32)
>>> a**2 # 要素ごとの累乗
array([[ 1, 4],
[ 9, 16]], dtype=int32)
|
線形代数学の演算
簡単な内積や外積の計算ならば、 NumPyデフォルトのメソッドで計算できるが、 ベクトルのノルムや連立方程式の解を求める場合は、 線形代数学(Linear algebra)のライブラリlinalgを使う。
この記事ではlinalgを以下のようにインポートする。
1
|
>>> from numpy import linalg as LA
|
内積・外積
2つの行列同士の内積を計算する場合、2つの方法がある。 1つ目は配列のdot()メソッドを用いる方法、 2つ目はNumPyのnp.dot()関数として使う方法である。
1
2
3
4
5
6
7
8
9
|
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6],[7,8]])
>>> c = np.array([9, 10])
>>> a.dot(b) # 行列の内積(その1)
array([[19, 22],
[43, 50]])
>>> np.dot(a, b) # 行列の内積(その2)
array([[19, 22],
[43, 50]])
|
3つ以上の行列同士の内積を計算する場合、LA.multi_dot()関数を用いる。 また、1つの行列の内積を何度もとる場合は、LA.matrix_power()関数を用いる。
1
2
3
4
5
|
>>> LA.multi_dot([a,b,c]) # 複数の配列の内積
array([391, 887])
>>> LA.matrix_power(a, 3) # 行列の内積の階乗(=LA.multi_dot([a,a,a]))
array([[ 37, 54],
[ 81, 118]])
|
2つの行列同士の外積を計算する場合、np.cross()関数を用いる。
1
2
3
4
|
>>> d = np.array([1, 2, 3])
>>> e = np.array([4, 5, 6])
>>> np.cross(d, e) # ベクトルの外積
array([-3, 6, -3])
|
ノルム・ランク・行列式
ベクトルのノルムを計算する場合、LA.norm()関数を用いる。 また、行列のランク(階数)を計算する場合はLA.matrix_rank()関数、 行列式を計算する場合はLA.det()関数をそれぞれ用いる。
1
2
3
4
5
6
7
8
|
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([1,2,3])
>>> LA.norm(b) # ベクトルのノルム
3.7416573867739413
>>> LA.matrix_rank(a) # 行列のランク(階数)
2
>>> LA.det(a) # 行列式 (1*4-2*3)
-2.0000000000000004
|
転置
行列の転置を計算する場合、元の行列のtransepose()メソッドまたは、 Tメソッドを用いる。
1
2
3
4
5
6
7
|
>>> a = np.array([[1,2],[3,4]])
>>> a.transpose() # 行列の転置(その1)
array([[1, 3],
[2, 4]])
>>> a.T # 行列の転置(その2)
array([[1, 3],
[2, 4]])
|
逆行列
行列を計算する場合、LA.inv()関数を用いる。
1
2
3
4
|
>>> b = np.array([[1,2],[3,4]])
>>> LA.inv(b) # 逆行列
array([[-2. , 1. ],
[ 1.5, -0.5]])
|
連立方程式の解
配列で定義された連立方程式を解く場合、LA.solve()関数を用いる。
1
2
3
4
5
6
7
|
>>> # 次の連立方程式を解く
>>> # 3x + y = 9
>>> # x + 2y = 8
>>> a = np.array([[3,1], [1,2]])
>>> b = np.array([9,8])
>>> LA.solve(a, b)
array([ 2., 3.])
|
固有値・固有ベクトル
1
2
3
4
5
6
7
|
>>> a = np.array([[1,2],[3,4]])
>>> w, v=LA.eig(a) # w: 行列の固有値、v: 固有ベクトル(正規化済み)
>>> w
array([-0.37228132, 5.37228132])
>>> v # 固有ベクトルv[i]は、固有値w[i]に対応する
array([[-0.82456484, -0.41597356],
[ 0.56576746, -0.90937671]])
|
特異値分解
1
2
3
4
5
6
7
8
9
10
11
|
>>> a = np.array([[1, 2, 3], [4, 5, 6]]) # m x n行列のとき
>>> U, s, V = np.linalg.svd(a) # 特異値分解
>>> U # U: m x mの直行行列
array([[-0.3863177 , -0.92236578],
[-0.92236578, 0.3863177 ]])
>>> s # s: 特異値
array([ 9.508032 , 0.77286964])
>>> V # V: n x nの直行行列
array([[-0.42866713, -0.56630692, -0.7039467 ],
[ 0.80596391, 0.11238241, -0.58119908],
[ 0.40824829, -0.81649658, 0.40824829]])
|
参考リンク
Linear algebra (numpy.linalg) — NumPy v1.19 Manual