メインコンテンツへスキップ

NumPy配列の演算

·1222 文字·3 分
目次

はじめに
#

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

環境
#

  • NumPy 1.19

基本的な四則演算
#

NumPy配列同士の四則演算は、Pythonにおける通常の四則演算と同様に行える。

>>> 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を以下のようにインポートする。

>>> from numpy import linalg as LA

内積・外積
#

2つの行列同士の内積を計算する場合、2つの方法がある。 1つ目は配列のdot()メソッドを用いる方法、 2つ目はNumPyのnp.dot()関数として使う方法である。

>>> 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()関数を用いる。

>>> 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()関数を用いる。 

>>> 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()関数をそれぞれ用いる。

>>> 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メソッドを用いる。

>>> 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()関数を用いる。

>>> b = np.array([[1,2],[3,4]])
>>> LA.inv(b)                 # 逆行列
array([[-2. ,  1. ],
       [ 1.5, -0.5]])

連立方程式の解
#

配列で定義された連立方程式を解く場合、LA.solve()関数を用いる。

>>> # 次の連立方程式を解く
>>> # 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.])

固有値・固有ベクトル
#

>>> 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]])

特異値分解
#

>>> 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
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

NumPy配列の操作
·1325 文字·3 分
NumPy配列のコピーや次元の結合、結合・分割、ソートについて。
NumPy配列の確認
·975 文字·2 分
作成したNumPy配列の要素などを確認する。
NumPyによる配列の作成
·2335 文字·5 分
NumPyを使って基本的な配列や線形代数学でよく使われる配列を生成する。
Plotlyのインタラクティブなグラフをブログ等に埋め込む
·1239 文字·3 分
Chart Studio Cloudに登録し、Plotlyのグラフをブログ等のWebページに埋め込む方法を説明する。
時系列データベースInfluxDBのクエリ文
·2959 文字·6 分
時系列データベースInfluxDBのクエリ文について、データの期間の指定や集約処理など基本的な構文をまとめた。
PythonとPandasでInfluxDBを操作する
·2486 文字·5 分
PythonとPandasを使って、時系列データベースInfluxDBを操作する方法についてまとめた。