Python NumPy eye() 関数:初心者でも簡単!単位行列の作り方

Python NumPy eye() 関数:初心者でも簡単!単位行列の作り方

NumPy は、Python で数値計算を行うための基本的なライブラリです。特に、多次元配列(ndarray)を効率的に扱う機能は、データ分析、機械学習、科学技術計算など、幅広い分野で活用されています。NumPy の中核となる機能の一つが、行列の作成と操作です。その中でも、特定の種類の行列、例えば単位行列を簡単に生成できる eye() 関数は、非常に重要で便利なツールです。

この記事では、NumPy の eye() 関数について、初心者の方でも理解できるように、その基本的な使い方から応用的な使い方まで、詳細に解説していきます。単位行列の概念から始まり、eye() 関数の構文、引数の意味、様々な使用例、そして identity() 関数との違いまで、幅広くカバーします。この記事を読めば、eye() 関数をマスターし、NumPy を使った行列計算をよりスムーズに行えるようになるでしょう。

目次

  1. 単位行列とは?

    • 1.1 正方行列
    • 1.2 対角成分と非対角成分
    • 1.3 単位行列の定義
    • 1.4 単位行列の重要性
  2. NumPy の eye() 関数

    • 2.1 eye() 関数の概要
    • 2.2 eye() 関数の構文
    • 2.3 引数の詳細
      • 2.3.1 N (行数)
      • 2.3.2 M (列数)
      • 2.3.3 k (対角線の位置)
      • 2.3.4 dtype (データ型)
      • 2.3.5 order (メモリレイアウト)
    • 2.4 eye() 関数の戻り値
  3. eye() 関数の基本的な使い方

    • 3.1 正方行列の作成
    • 3.2 行数と列数が異なる行列の作成
    • 3.3 対角線の位置を調整する
    • 3.4 データ型を指定する
  4. eye() 関数の応用的な使い方

    • 4.1 ブール型の単位行列の作成
    • 4.2 複素数型の単位行列の作成
    • 4.3 多次元配列での eye() 関数の利用 (非推奨)
  5. eye() 関数と identity() 関数の違い

    • 5.1 identity() 関数の概要
    • 5.2 identity() 関数の構文
    • 5.3 eye() 関数と identity() 関数の比較
    • 5.4 どちらを使うべきか?
  6. eye() 関数を使う上での注意点

    • 6.1 大きなサイズの行列の作成
    • 6.2 データ型の選択
    • 6.3 メモリ効率
  7. まとめ


1. 単位行列とは?

eye() 関数を理解するためには、まず単位行列の概念を理解する必要があります。単位行列は、線形代数において非常に重要な役割を果たす特別な行列です。

1.1 正方行列

単位行列を理解する上で、まず正方行列という概念を知っておく必要があります。正方行列とは、行数と列数が等しい行列のことです。例えば、2×2 の行列や 3×3 の行列は正方行列です。

“`

2×2 の正方行列

[[1, 2],
[3, 4]]

3×3 の正方行列

[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
“`

正方行列は、行列式を計算したり、固有値を求めたりするなど、線形代数の多くの操作で用いられます。

1.2 対角成分と非対角成分

正方行列において、左上から右下に向かって並ぶ要素を対角成分と言います。例えば、3×3 の行列の場合、(0,0)、(1,1)、(2,2) の要素が対角成分です。

対角成分以外の要素は非対角成分と呼ばれます。

“`

3×3 の正方行列

[[1, 2, 3], # 1, 5, 9 が対角成分
[4, 5, 6],
[7, 8, 9]]
“`

1.3 単位行列の定義

単位行列は、正方行列であり、対角成分がすべて 1 で、非対角成分がすべて 0 である行列です。単位行列は、通常、I (または E) という記号で表されます。

“`

2×2 の単位行列

[[1, 0],
[0, 1]]

3×3 の単位行列

[[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]
“`

1.4 単位行列の重要性

単位行列は、線形代数において非常に重要な役割を果たします。

  • 乗法における単位元: 任意の行列 A に対して、単位行列 I を掛けても、行列 A は変化しません。つまり、A * I = I * A = A が成り立ちます。これは、数値計算における「1」と同様の役割です。
  • 逆行列の定義: 行列 A の逆行列 A-1 は、A * A^-1 = A^-1 * A = I を満たす行列として定義されます。つまり、逆行列は、単位行列を使って定義されます。
  • 線形変換の表現: 単位行列は、線形変換を行わない変換を表します。
  • 各種アルゴリズムの初期化: 単位行列は、様々な数値計算アルゴリズムにおいて、初期値として使用されることがあります。

このように、単位行列は、線形代数の様々な概念や計算において、基本的な役割を果たしています。

2. NumPy の eye() 関数

NumPy の eye() 関数は、単位行列を簡単に生成するための関数です。この関数を使うことで、手動で要素を設定する必要なく、簡単に単位行列を作成できます。

2.1 eye() 関数の概要

eye() 関数は、指定された行数と列数を持つ行列を作成し、その対角成分を 1、その他の要素を 0 に設定します。作成される行列は、NumPy の ndarray オブジェクトとして返されます。

2.2 eye() 関数の構文

eye() 関数の構文は以下の通りです。

python
numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, like=None)

2.3 引数の詳細

eye() 関数は、いくつかの引数を受け取ります。それぞれの引数の意味と役割について詳しく解説します。

  • N (int): 行数

    • 作成する行列の行数を指定します。必須の引数です。
    • 正の整数である必要があります。
    • M (int, optional): 列数 (デフォルト: None)

    • 作成する行列の列数を指定します。省略可能です。

    • M が省略された場合、N と同じ値が使用され、正方行列が作成されます。
    • 正の整数である必要があります。
    • k (int, optional): 対角線の位置 (デフォルト: 0)

    • 対角成分を 1 に設定する対角線の位置を指定します。省略可能です。

    • k = 0 は主対角線(左上から右下)を表します。
    • k > 0 は主対角線よりも上の対角線を表します。
    • k < 0 は主対角線よりも下の対角線を表します。
    • dtype (data-type, optional): データ型 (デフォルト: float)

    • 作成する行列の要素のデータ型を指定します。省略可能です。

    • NumPy のデータ型(numpy.int32numpy.float64numpy.complex128 など)を指定できます。
    • 省略された場合、デフォルトで float64 が使用されます。
    • order ({‘C’, ‘F’}, optional): メモリレイアウト (デフォルト: ‘C’)

    • 作成する行列のメモリレイアウトを指定します。省略可能です。

    • 'C' は C スタイルの行優先順(row-major)レイアウトを意味します。
    • 'F' は Fortran スタイルの列優先順(column-major)レイアウトを意味します。
    • 通常はデフォルトの 'C' で問題ありません。
    • like (array_like, optional): 型とデータ型をコピーするオブジェクト (デフォルト: None)

    • 結果の型とデータ型を定義するために使用されるオブジェクト。

2.3.1 N (行数)

N は、作成する行列の行数を指定する必須の引数です。正の整数を指定する必要があります。

“`python
import numpy as np

3行の行列を作成

identity_matrix = np.eye(3)
print(identity_matrix)

出力:

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]

“`

2.3.2 M (列数)

M は、作成する行列の列数を指定するオプションの引数です。M を省略した場合、N と同じ値が使用され、正方行列が作成されます。

“`python
import numpy as np

3行4列の行列を作成

rectangular_matrix = np.eye(3, 4)
print(rectangular_matrix)

出力:

[[1. 0. 0. 0.]

[0. 1. 0. 0.]

[0. 0. 1. 0.]]

“`

2.3.3 k (対角線の位置)

k は、対角成分を 1 に設定する対角線の位置を指定するオプションの引数です。

  • k = 0: 主対角線(左上から右下)
  • k > 0: 主対角線よりも上の対角線
  • k < 0: 主対角線よりも下の対角線

“`python
import numpy as np

主対角線よりも1つ上の対角線を1にする

shifted_matrix_above = np.eye(3, k=1)
print(shifted_matrix_above)

出力:

[[0. 1. 0.]

[0. 0. 1.]

[0. 0. 0.]]

主対角線よりも1つ下の対角線を1にする

shifted_matrix_below = np.eye(3, k=-1)
print(shifted_matrix_below)

出力:

[[0. 0. 0.]

[1. 0. 0.]

[0. 1. 0.]]

“`

2.3.4 dtype (データ型)

dtype は、作成する行列の要素のデータ型を指定するオプションの引数です。NumPy のデータ型(numpy.int32numpy.float64numpy.complex128 など)を指定できます。

“`python
import numpy as np

整数型の単位行列を作成

integer_matrix = np.eye(3, dtype=np.int32)
print(integer_matrix)
print(integer_matrix.dtype)

出力:

[[1 0 0]

[0 1 0]

[0 0 1]]

int32

複素数型の単位行列を作成

complex_matrix = np.eye(3, dtype=np.complex128)
print(complex_matrix)
print(complex_matrix.dtype)

出力:

[[1.+0.j 0.+0.j 0.+0.j]

[0.+0.j 1.+0.j 0.+0.j]

[0.+0.j 0.+0.j 1.+0.j]]

complex128

“`

2.3.5 order (メモリレイアウト)

order は、作成する行列のメモリレイアウトを指定するオプションの引数です。'C' は C スタイルの行優先順(row-major)レイアウトを意味し、'F' は Fortran スタイルの列優先順(column-major)レイアウトを意味します。通常はデフォルトの 'C' で問題ありません。この引数は、大規模な行列を扱う場合に、パフォーマンスに影響を与える可能性があります。

“`python
import numpy as np

Fortran スタイルのメモリレイアウトで単位行列を作成

fortran_matrix = np.eye(3, order=’F’)
print(fortran_matrix)
print(fortran_matrix.flags)

出力:

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]

C_CONTIGUOUS : False

F_CONTIGUOUS : True

OWNDATA : True

WRITEABLE : True

ALIGNED : True

WRITEBACKIFCOPY : False

UPDATEIFCOPY : False

“`

2.4 eye() 関数の戻り値

eye() 関数は、NumPy の ndarray オブジェクトとして単位行列(または単位行列のような行列)を返します。

3. eye() 関数の基本的な使い方

ここでは、eye() 関数の基本的な使い方を具体的な例を通して解説します。

3.1 正方行列の作成

eye() 関数を使って、最も基本的な単位行列である正方行列を作成する方法を説明します。

“`python
import numpy as np

3×3 の単位行列を作成

identity_matrix = np.eye(3)
print(identity_matrix)

出力:

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]

5×5 の単位行列を作成

identity_matrix_5 = np.eye(5)
print(identity_matrix_5)

出力:

[[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.]]

“`

eye() 関数に引数として行数(および列数)を指定するだけで、簡単に正方行列を作成できます。

3.2 行数と列数が異なる行列の作成

eye() 関数を使って、行数と列数が異なる行列を作成することもできます。これは、正方行列ではない単位行列のような行列を作成する場合に便利です。

“`python
import numpy as np

3行4列の行列を作成

rectangular_matrix = np.eye(3, 4)
print(rectangular_matrix)

出力:

[[1. 0. 0. 0.]

[0. 1. 0. 0.]

[0. 0. 1. 0.]]

4行3列の行列を作成

rectangular_matrix_2 = np.eye(4, 3)
print(rectangular_matrix_2)

出力:

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]

[0. 0. 0.]]

“`

eye() 関数に、行数と列数をそれぞれ引数として指定することで、行数と列数が異なる行列を作成できます。

3.3 対角線の位置を調整する

eye() 関数の k 引数を使うことで、対角成分を 1 に設定する対角線の位置を調整できます。

“`python
import numpy as np

主対角線よりも1つ上の対角線を1にする

shifted_matrix_above = np.eye(3, k=1)
print(shifted_matrix_above)

出力:

[[0. 1. 0.]

[0. 0. 1.]

[0. 0. 0.]]

主対角線よりも1つ下の対角線を1にする

shifted_matrix_below = np.eye(3, k=-1)
print(shifted_matrix_below)

出力:

[[0. 0. 0.]

[1. 0. 0.]

[0. 1. 0.]]

5×5 の行列で、主対角線よりも2つ上の対角線を1にする

shifted_matrix_above_2 = np.eye(5, k=2)
print(shifted_matrix_above_2)

出力:

[[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 引数に正の整数を指定すると、主対角線よりも上の対角線が 1 に設定され、負の整数を指定すると、主対角線よりも下の対角線が 1 に設定されます。

3.4 データ型を指定する

eye() 関数の dtype 引数を使うことで、作成する行列の要素のデータ型を指定できます。

“`python
import numpy as np

整数型の単位行列を作成

integer_matrix = np.eye(3, dtype=np.int32)
print(integer_matrix)
print(integer_matrix.dtype)

出力:

[[1 0 0]

[0 1 0]

[0 0 1]]

int32

複素数型の単位行列を作成

complex_matrix = np.eye(3, dtype=np.complex128)
print(complex_matrix)
print(complex_matrix.dtype)

出力:

[[1.+0.j 0.+0.j 0.+0.j]

[0.+0.j 1.+0.j 0.+0.j]

[0.+0.j 0.+0.j 1.+0.j]]

complex128

ブール型の単位行列を作成

bool_matrix = np.eye(3, dtype=np.bool_)
print(bool_matrix)
print(bool_matrix.dtype)

出力:

[[ True False False]

[False True False]

[False False True]]

bool

“`

dtype 引数に NumPy のデータ型を指定することで、様々な型の単位行列を作成できます。

4. eye() 関数の応用的な使い方

ここでは、eye() 関数の応用的な使い方について解説します。

4.1 ブール型の単位行列の作成

eye() 関数を使って、ブール型の単位行列を作成できます。これは、特定の条件を満たす要素を抽出したり、マスク処理を行ったりする際に役立ちます。

“`python
import numpy as np

ブール型の単位行列を作成

bool_matrix = np.eye(3, dtype=np.bool_)
print(bool_matrix)

出力:

[[ True False False]

[False True False]

[False False True]]

“`

4.2 複素数型の単位行列の作成

eye() 関数を使って、複素数型の単位行列を作成できます。これは、量子力学や信号処理などの分野で役立ちます。

“`python
import numpy as np

複素数型の単位行列を作成

complex_matrix = np.eye(3, dtype=np.complex128)
print(complex_matrix)

出力:

[[1.+0.j 0.+0.j 0.+0.j]

[0.+0.j 1.+0.j 0.+0.j]

[0.+0.j 0.+0.j 1.+0.j]]

“`

4.3 多次元配列での eye() 関数の利用 (非推奨)

eye() 関数は、基本的に2次元配列(行列)を作成するための関数です。しかし、NumPy のブロードキャスティング機能を利用することで、多次元配列の一部を単位行列にすることも可能です。ただし、この方法は直感的ではなく、可読性を損なう可能性があるため、あまり推奨されません。

“`python
import numpy as np

3x3x3 の多次元配列を作成

multi_dimensional_array = np.zeros((3, 3, 3))

多次元配列の一部を単位行列にする (非推奨)

multi_dimensional_array[0] = np.eye(3)
multi_dimensional_array[1] = np.eye(3)
multi_dimensional_array[2] = np.eye(3)

print(multi_dimensional_array)

出力:

[[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]]

“`

より可読性の高い方法としては、ループを使って各要素に値を代入する方法や、numpy.tile() 関数を使って単位行列を並べる方法などがあります。

5. eye() 関数と identity() 関数の違い

NumPy には、単位行列を作成するための関数として、eye() 関数と identity() 関数の2つが存在します。ここでは、これらの関数の違いについて詳しく解説します。

5.1 identity() 関数の概要

identity() 関数は、正方行列の単位行列を作成するための関数です。

5.2 identity() 関数の構文

identity() 関数の構文は以下の通りです。

python
numpy.identity(n, dtype=None, *, like=None)

5.3 eye() 関数と identity() 関数の比較

eye() 関数と identity() 関数の主な違いは以下の通りです。

  • 作成できる行列: eye() 関数は正方行列だけでなく、行数と列数が異なる行列も作成できます。一方、identity() 関数は正方行列しか作成できません。
  • 対角線の位置: eye() 関数は k 引数を使って、対角成分を 1 に設定する対角線の位置を調整できます。一方、identity() 関数は常に主対角線のみを 1 に設定します。
  • 引数の数: eye() 関数は N, M, k, dtype, order と複数の引数を受け取りますが、identity() 関数は n, dtype と少数の引数しか受け取りません。
特徴 eye() 関数 identity() 関数
作成できる行列 正方行列、行数と列数が異なる行列 正方行列のみ
対角線の位置 調整可能 (k 引数) 主対角線のみ
引数の数 多い 少ない

5.4 どちらを使うべきか?

どちらの関数を使うべきかは、作成したい行列の種類によって異なります。

  • 正方行列を作成する場合: identity() 関数の方が、引数が少なく、シンプルで分かりやすいため、identity() 関数を使うのがおすすめです。
  • 行数と列数が異なる行列を作成する場合: eye() 関数を使う必要があります。
  • 対角線の位置を調整したい場合: eye() 関数を使う必要があります。

一般的に、eye() 関数はより汎用的な関数であり、identity() 関数は eye() 関数の特殊なケースと考えることができます。

6. eye() 関数を使う上での注意点

eye() 関数は非常に便利な関数ですが、使用する上で注意すべき点もあります。

6.1 大きなサイズの行列の作成

eye() 関数を使って非常に大きなサイズの行列を作成する場合、メモリを大量に消費する可能性があります。特に、デフォルトの float64 型で大きな行列を作成すると、メモリ不足になることがあります。

“`python
import numpy as np

10000×10000 の単位行列を作成 (メモリを大量に消費する可能性あり)

large_matrix = np.eye(10000) # メモリ不足になる可能性あり

“`

このような場合は、データ型を float32 に変更したり、不要な変数を削除したりするなど、メモリ使用量を削減する工夫が必要です。

6.2 データ型の選択

eye() 関数で作成する行列のデータ型は、その後の計算に影響を与える可能性があります。例えば、整数型の行列と浮動小数点型の行列を掛け合わせると、結果は浮動小数点型になります。

“`python
import numpy as np

整数型の単位行列を作成

integer_matrix = np.eye(3, dtype=np.int32)

浮動小数点型の行列を作成

float_matrix = np.array([[1.1, 2.2, 3.3],
[4.4, 5.5, 6.6],
[7.7, 8.8, 9.9]])

行列の掛け算

result_matrix = integer_matrix @ float_matrix
print(result_matrix)
print(result_matrix.dtype)

出力:

[[1.1 2.2 3.3]

[4.4 5.5 6.6]

[7.7 8.8 9.9]]

float64

“`

したがって、データ型は、計算の精度やメモリ使用量などを考慮して、適切に選択する必要があります。

6.3 メモリ効率

NumPy の ndarray は、メモリ上に連続して配置されます。そのため、大規模な行列を扱う場合は、メモリレイアウト(order 引数)がパフォーマンスに影響を与える可能性があります。通常はデフォルトの 'C' で問題ありませんが、特定の計算処理によっては 'F' を指定する方が効率的な場合があります。

7. まとめ

この記事では、NumPy の eye() 関数について、その基本的な使い方から応用的な使い方まで、詳細に解説しました。

  • eye() 関数は、単位行列(または単位行列のような行列)を簡単に生成するための関数です。
  • eye() 関数は、行数、列数、対角線の位置、データ型などを指定できます。
  • eye() 関数と identity() 関数の違いを理解し、適切な関数を選択することが重要です。
  • 大規模な行列を扱う場合は、メモリ使用量やデータ型に注意する必要があります。

eye() 関数をマスターすることで、NumPy を使った行列計算をよりスムーズに行えるようになります。この記事が、NumPy を学習する上で少しでもお役に立てれば幸いです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール