JavaScriptを有効にしてください

NumPy配列の演算

 ·   3 min read

はじめに

NumPy配列の四則演算と線形代数学の演算について。

環境

ソフトウェア バージョン
NumPy 1.19

基本的な四則演算

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

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です