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() 関数の方が指定できるパラメータが多くある.