numpy.eyeで単位行列を生成する

numpy.eyeとnumpy.identityで単位行列を生成する

numpy.eye を使うと 単位行列 を生成することができます。単位行列を生成できますが、それだけでなく、対角線をずらしたり正方行列ではない形状も生成できます。

numpy.identity という関数も用意されており、これは単位行列のみを生成することが可能です。numpy.identity を呼び出すと、内部で numpy.eye が呼ばれて単位行列が生成されます。

これらの関数の使い方をまとめます。なお、ここでいう行列は、ndarrayのことです。

単位行列とは

まずは目的となる単位行列の性質を説明します。

単位行列とは、正方行列(行数と列数が等しい行列)のうち、右下がりの対角線上の要素がすべて1、それ以外の要素がすべて0の行列のことを言います。

単位行列Iは、行列Aに対して以下の式が成り立ちます。

AI = IA = A

3×3の単位行列は、ndarrayだと以下のようなデータになります。

import numpy as np

a = np.array([
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1]
])

もちろん単位行列がほしい時にいちいちこんな風に書くことはできないので、numpy.eyenumpy.identity を使って生成します。

numpy.eye関数の使い方

引数で生成される行列の行数を指定すると、単位行列を生成してくれます。例えば、3×3の単位行列を生成するには以下のようにします。

import numpy as np

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

単位行列の生成という点では、上記コードでOKだと思います。行数の指定以外にもいくつかパラメータを指定することができます。対角線の位置や行列のサイズを変更することが可能です。

numpy.eye関数のパラメータ

numpy.eye(N, M=None, k=0, dtype=<type 'float'>)

パラメータ 説明
N int 生成される配列の行数を指定します。
M int 省略可能。生成される配列の列数を指定します。省略した場合は N と同一の値を使用します。
k int 省略可能。対角のインデックスを指定します。0(デフォルト値)の場合、左上頂点([0][0])からの対角線となります。正の数の場合、対角線がk列分右にシフトします。負の数の場合、対角線が下に-k行分シフトします。
dtype dtype 省略可能。出力配列の型を指定します。デフォルトは'float'

return値として、N×Mの2次元配列を返します。kで指定した対角線上の値が1でそれ以外の値がすべて0のとなっています。

では行列のサイズや対角線を指定して生成してみます。

import numpy as np

# 3×4の行列、対角線を右に1ずらす
a = np.eye(3, 4, 1, dtype="float")
print(a)
# [[ 0.  1.  0.  0.]
#  [ 0.  0.  1.  0.]
#  [ 0.  0.  0.  1.]]

# サイズ5の単位行列、対角線を下に2ずらす
b = np.eye(5, k=-2)
print(b)
# [[ 0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.]
#  [ 1.  0.  0.  0.  0.]
#  [ 0.  1.  0.  0.  0.]
#  [ 0.  0.  1.  0.  0.]]

1が要素となる対角線が指定した大きさ分移動していることがわかります。

numpy.identity関数

上述の通り、numpy.eye関数では単位行列を生成することができますが、パラメータをしていすることでそれ以外にも、正方行列以外の行列のサイズや、1が要素となる対角線の位置を変更する可能です。

一方、numpy.identity は単位行列を生成するためだけにしか使用できません。パラメータもサイズ(行数=列数)と型しか指定する必要はありません。

numpy.identity関数のパラメータ

パラメータ 説明
N int 生成される配列の行数を指定します。
dtype dtype 省略可能。出力配列の型を指定します。デフォルトは'float'

numpy.identity(n, dtype=None)

return値として、N×Nの2次元配列を返します。対角線上の値が1でそれ以外の値がすべて0のとなっています。

import numpy as np

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

b = np.identity(4, dtype="float")
print(b)
# [[ 1.  0.  0.  0.]
#  [ 0.  1.  0.  0.]
#  [ 0.  0.  1.  0.]
#  [ 0.  0.  0.  1.]]

numpy.eye と numpy.identity の違い

def identity(n, dtype=None):
    from numpy import eye
    return eye(n, dtype=dtype)

上記の通り、numpy.identityは、内部的には numpy.eye が呼ばれる形で実装されています。したがって以下の単位行列を生成するための処理は等価であり、パフォーマンスにも差はありません。

import numpy as np

a = np.eye(4, dtype="float")
b = np.identity(4, dtype="float")

単位行列の生成という点から見ると、違いは関数名のみです。単位行列(identity matrix)を生成するという点を強調する場合には、numpy.identity を使用するというのが良いでしょう。

まとめ

  • 単位行列を生成するには、numpy.eye もしくは numpy.identity を使用する。
  • numpy.eye は、行列のサイズや対角線の位置を変更できる。
  • numpy.identity は、単位行列生成できない。
  • numpy.identity は、内部的に numpy.eye を呼び出すのでパフォーマンスに差はない。

以上。

参考URL