NumPy で「単位行列」を生成するときに identity()
関数と eye()
関数がサポートされている.それぞれの違いを整理するためにドキュメントを読みながら試してみた.今回は Numpy 1.20.2
を前提にする.ドキュメントには (almost) equivalent function
と書いてあってほぼ同じ機能だけど,簡単に言えば identity()
関数はとてもシンプルで eye()
関数では一部パラメータを指定できる自由度がある.
なお「単位行列」とは,以下のように斜めの値(対角成分)が全て 1
の行列のことで,どんな行列との内積も行列の値が変化しないため,数字の 1
のような性質を持った行列と言える.行列は「はてな記法一覧」の TeX 記法 [tex:]
を使っている.
identity
関数を試す 🔢
まず,identity()
関数を試す.identity()
関数はシンプルで,引数に指定したサイズの「正方行列」で「単位行列」を生成する.サンプルとして identity(3)
と identity(5)
を載せておく.
import numpy as np np.identity(3) # array([[1., 0., 0.], # [0., 1., 0.], # [0., 0., 1.]]) np.identity(5) # array([[1., 0., 0., 0., 0.], # [0., 1., 0., 0., 0.], # [0., 0., 1., 0., 0.], # [0., 0., 0., 1., 0.], # [0., 0., 0., 0., 1.]])
配列の中に含まれている数値はデフォルトでは float64
型になる.identity()
関数に dtype
パラメータを指定すると型を変えられるため,以下は int
を指定した.実際には int64
型になった.
np.identity(3).dtype # dtype('float64') np.identity(5, dtype=int) # array([[1, 0, 0, 0, 0], # [0, 1, 0, 0, 0], # [0, 0, 1, 0, 0], # [0, 0, 0, 1, 0], # [0, 0, 0, 0, 1]]) np.identity(5, dtype=int).dtype # dtype('int64')
eye()
関数を試す 🔢
次に eye()
関数を試す.基本的には identity()
関数と同じで,引数に指定したサイズの「正方行列」で「単位行列」を生成する.サンプルとして eye(3)
と eye(5)
を載せておく.
np.eye(3) # array([[1., 0., 0.], # [0., 1., 0.], # [0., 0., 1.]]) np.eye(5) # array([[1., 0., 0., 0., 0.], # [0., 1., 0., 0., 0.], # [0., 0., 1., 0., 0.], # [0., 0., 0., 1., 0.], # [0., 0., 0., 0., 1.]])
配列の中に含まれている数値もデフォルトでは float64
型で同じ.eye()
関数の dtype
パラメータに int
を指定すると,同じく int64
型になる.ここまでは特に違いはなかった.
np.eye(3).dtype # dtype('float64') np.eye(3, dtype=int) # array([[1, 0, 0], # [0, 1, 0], # [0, 0, 1]]) np.eye(3, dtype=int).dtype # dtype('int64')
identity()
関数との違いとして,eye()
関数では k
プロパティがサポートされている.k
プロパティを指定すると,以下のように値が 1
になる軸を上下にズラすことができる.以下はサンプルとして k=1
と k=-1
の例を載せている.実務上だと k
プロパティをどういう場面で使うんだろう?
他にも eye()
関数には M
プロパティ(列数を指定して正方行列ではない単位行列を生成する)など,いくつかのプロパティがある.
np.eye(5, k=1) # array([[0., 1., 0., 0., 0.], # [0., 0., 1., 0., 0.], # [0., 0., 0., 1., 0.], # [0., 0., 0., 0., 1.], # [0., 0., 0., 0., 0.]]) np.eye(5, k=-1) # array([[0., 0., 0., 0., 0.], # [1., 0., 0., 0., 0.], # [0., 1., 0., 0., 0.], # [0., 0., 1., 0., 0.], # [0., 0., 0., 1., 0.]])
まとめ 🔢
最近は NumPy を学んでいる.今回は NumPyで「単位行列」を生成できる identity()
関数と eye()
関数を試しつつ,機能の違いも確認した.ドキュメントには (almost) equivalent function
と書いてあるけど,eye()
関数の方が指定できるパラメータが多くある.