NumPyのeye関数で単位行列を作成する方法

np.eye関数は単位行列を作成する関数です。単位行列とは、対角線の要素が1で、それ以外の要素は0で構成されている配列のことです。単位行列は One-hot とも呼ばれ、機械学習の「特徴量エンジニアリング」というステップで頻繁に出てくる重要な配列です。

なお、同じような関数にnp.identity関数があります。両者の違いは、np.eye関数は N x M の自由な形状の単位行列を作成することができますが、np.identity関数では NxN の正方行列の作成のみ可能という点です。そのためnp.eye関数の方が設定できるパラメータが多く、より自由度が高いです。

このページでは、このnp.eye関数の使い方をサンプルコードを見ながら確認していきます。

なお、np.identity関数については、『numpy.identity関数で単位正方行列を作成する方法』で解説していますので、あわせてご確認ください。

目次

1. numpy.eyeの使い方

それでは、まずは書き方を確認しましょう。

numpy.eye関数

書き方:

np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')

パラメーター:

引数   解説
N int 生成する配列の行数を指定
M(optional) int     
生成する配列の列数を指定。デフォルトのNoneの場合は、Nと同じになる。
k(optional)int1を配置する対角線の開始位置をインデックスで指定。負の値を指定することもできます。
dtype(optional) data-type生成する配列のデータ型を指定します。
order(optional){‘C’, ‘F’}メモリレイアウトを指定します。’C’がC言語方式で、’F’がFortran方式です。

戻り値: 

ndarray:k番目のインデックスから始まる対角線は1で、それ以外の要素が0で埋められたshape(N, M)の2次元配列

一緒に確認したい関数:

  • identity: 単位正方行列を作成
  • diag: 対角線の要素を取得

2. サンプルコード

それではサンプルコードで使い方を確認しましょう。

引数Nだけを渡した場合

まず、引数Nだけ渡した場合は、shape(N, N)の2次元配列を生成します。

In [1]:
'''  引数を1つだけ渡す場合  '''
import numpy as np
np.eye(3)
Out[1]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

引数NとMを渡した場合

第一引数Nと第二引数Mを渡した場合は、shape(N, M)の2次元配列を生成します。

In [2]:
'''  第一引数で行数、第二引数で列数を指定  '''
arr = np.eye(3, 4)
print(arr)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]]

引数 k で対角線の位置を指定

第三引数kでは、1を配置する対角線の開始位置のインデックスを指定することができます。

In [3]:
'''  第三引数で対角線のインデックスを指定  '''
arr1 = np.eye(3, 5, 1)
print('arr1:\n', arr1, '\n')

#  こちらの書き方も可能です。
arr2 = np.eye(5, k=2)
print('arr2:\n', arr2)
arr1:
 [[0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]] 

arr2:
 [[0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

なお、kは負の値でも構いません。その場合は、行の下から反対方向に対角線の開始位置がずれていきます。

In [4]:
'''  kの値は負の値でも可能  '''
arr2 = np.eye(5, k=-1)
print('arr2:\n', arr2)
arr2:
 [[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.]]

データ型の指定

np.eye()で生成される配列の型はデフォルトではfloat型です。

オプション引数「dtype=」で別のデータ型を指定することができます。以下のコードではint型の配列を生成しています。なお、dtypeの種類や指定する時の書き方等に関しては、『NumPyのdtype属性の一覧と参照・指定・変更方法』をご確認下さい。

In [5]:
'''  dtypeを指定  '''
#  int型を指定
arr = np.eye(5, dtype=int)
print(arr)
print(arr.dtype)
[[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]]
int64

Python3の標準以外のビット数を指定することもできます。

In [6]:
'''  ビット数の指定も可能  '''
arr = np.eye(5, dtype=np.int32)
print(arr)
print(arr.dtype)
[[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]]
int32

ただし、ビット数が異なると、数値処理の際の丸めのルールが異なってしまい、予期せぬところで大きな誤差を呼んでしまうので、本当に必要と確信している時以外は、ビット数の変更はおすすめしません。

メモリレイアウトの指定

オプション引数「order=」は、データをメモリに格納する時のメモリレイアウトを指定するものです。

NumPyのメモリレイアウトは、データを順番に横に格納するC言語方式と、縦に格納するFortran方式があります。

これを、次のようにして指定することができます。

In [6]:
'''  メモリレイアウトの指定  '''
#  デフォルトはC言語方式
arr1 = np.eye(2)
print('arr1: \n', arr1)
#  メモリレイアウトの確認
print('C:', arr1.flags['C_CONTIGUOUS'])
print('F:', arr1.flags['F_CONTIGUOUS'], '\n')

#  Fortran方式を指定
arr2 = np.eye(2, order='F')
print('arr2: \n', arr2)
#  メモリレイアウトの確認
print('C:', arr2.flags['C_CONTIGUOUS'])
print('F:', arr2.flags['F_CONTIGUOUS'])
arr1: 
 [[1. 0.]
 [0. 1.]]
C: True
F: False 

arr2: 
 [[1. 0.]
 [0. 1.]]
C: False
F: True

3. まとめ

以上がnp.eye関数の使い方です。データ分析や特徴量エンジニアリングで使用することになりますので、覚えておきましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる