【numpyの基礎】行列の基本(単位行列、乱数行列、線形代数)

こんにちは、unogram管理人のうのちゅ〜です。

【numpyの基礎】シリーズとして、Pythonの数値計算用拡張モジュールnumpyの基礎について学んでいきます。

今回はその中でも、行列の基本として、単位行列や乱数行列の生成、線形代数に関わる関数について解説していきます。

ベクトルについては【numpyの基礎】ベクトルの生成、逆順、転置(行と列の入れ替え)で解説しているので、こちらもご覧ください。

【numpyの基礎】では一部100 numpy exercisesを参考に、コメント等を加筆して初心者の方にもわかりやすく説明していきます。

それでは見ていきましょう!



【numpyの基礎】行列の基本(単位行列、乱数行列、線形代数)

単位行列の生成 np.eye

numpyをインポートし、単位行列(対角成分が全て0の行列)を生成します。

np.eye(N)でN行N列の単位行列が生成できます。

import numpy as np

a = np.eye(3)
print(a)
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]

正方行列でなくても生成可能です。

b=np.eye(2,3)
print(b)
# [[1. 0. 0.]
#  [0. 1. 0.]]

乱数生成 np.random

一様分布乱数 np.random.rand

np.random.rand(M,N)で、0.0〜1.0の範囲の値からなるM行N列の一様分布乱数行列を生成します。

c=np.random.rand(2,3)
print(c)
# [[0.34705107 0.04121481 0.52314056]
#  [0.07976944 0.23021071 0.0462708 ]]

整数からなる一様分布乱数 np.random.randint

np.random.randint(i,j,(M,N))で、i以上j未満の整数からなるM行N列の乱数行列を生成します。

e=np.random.randint(1,10,(2,3))
print(e)
# [[9 2 1]
#  [2 3 3]]

正規分布乱数 np.random.randn

np.random.randn(M,N)でM行N列の正規分布乱数(平均0, 標準偏差1)を生成します。

d=np.random.randn(3,4)
print(d)
# [[-0.13619511  0.05422142  0.74467704  1.29886696]
#  [ 1.38047588  0.3564233  -0.6461106   1.16935703]
#  [-1.3305887  -0.93959496 -0.29683735 -0.5925274 ]]

numpyには他にも多くの乱数生成関数が存在します。以下にその一部を紹介します。

その他のnumpy乱数生成関数の例
  • 二項分布 np.random.binomial
  • ポアソン分布 np.random.poisson
  • ベータ分布 np.random.beta
  • ガンマ分布 np.random.gamma



行列積 np.matmul, dot

行列Aと行列Bの積Cは、C=np.matmul(A,B)で求められます。

また、C=A.dot(B)で求めることもできます。

e=np.arange(9).reshape(3,3)
f=np.arange(1,10).reshape(3,3)
print(e)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
print(f)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

g=np.matmul(e,f)
print(g)
# [[ 18  21  24]
#  [ 54  66  78]
#  [ 90 111 132]]

h=e.dot(f)
print(h)
# [[ 18  21  24]
#  [ 54  66  78]
#  [ 90 111 132]]

対角行列の抽出、生成 np.diag

行列Aの対角成分の抽出はnp.diag(A)で実行できます。

また、ベクトルaを対角成分にもつ対角行列AはA=np.diag(a)で生成できます。

# 対角行列の抽出
i=np.arange(9).reshape(3,3)
print(np.diag(i))
# [0 4 8]

# 対角行列の生成
j=np.diag(np.arange(3))
print(j)
# [[0 0 0]
   [0 1 0]
   [0 0 2]]

#引数はndarrayでなく、リストなどでも良い
k=np.diag([3,4,5])
print(k)
# [[3 0 0]
#  [0 4 0]
#  [0 0 5]]

ランク np.linalg.matrix_rank

行列Aのランクを求めたい場合、np.linalg.matrix_rank(A)で求めることができます。

l=np.random.randint(1,10, (3,3)) #1〜9の数字からランダムに3x3行列を生成
print(l)
# [[6 8 4]
#  [8 3 9]
#  [5 6 1]]

print(np.linalg.matrix_rank(l))
# 3

固有値・固有ベクトル np.linalg.eig

np.linalg.eig(A)は行列Aの固有値と固有ベクトルを返します。

np.linalg.eigvals(A)とすることで、固有値のみを取得することもできます。

m = np.random.randint(1,10,(2,2)) #1〜9の数字からランダムに3x3行列を生成
print(m)
# [[8 9]
#  [6 3]]

# np.linalg.eigは固有値と固有ベクトルを返す
eigvals, eigvecs = np.linalg.eig(m)
print(eigvals) 
# [13.26208735 -2.26208735]
print(eigvecs)
# [[ 0.86327385 -0.659362  ]
#  [ 0.50473582  0.75182561]]

# np.linalg.eigvalsは固有値のみを返す
print(np.linalg.eigvals(m)) 
# [13.26208735 -2.26208735]



まとめ

今回は、【numpyの基礎】シリーズとして、行列の基本である単位行列や乱数行列の生成、線形代数に関わる関数について解説してきました。

numpyによる行列の扱い方は数値計算の基本なのでしっかり押さえておきましょう。

参考書を使った学習に進んでみたい方は以下の書籍もおすすめなので、参考にしてみてください。