Python・NumPyのmatrix_rank()で特異値分解(SVD)により配列の行列ランクを求める方法
特異値分解(SVD:Singular Value Decomposition)の手法を用いて配列の行列ランクを求めるには、Pythonの numpy.linalg.matrix_rank() メソッドを使用します。
配列のランクとは、その配列が持つ特異値のうち、許容誤差 tol より大きい値の個数を指します。この記事では、matrix_rank() の基本的な使い方から各パラメータの意味、実際のコード例と実行結果までをわかりやすく解説します。
matrix_rank()メソッドの主なパラメータ
第1引数:A
ランクを計算したい入力ベクトル、または行列のスタック(多次元配列)を指定します。
第2引数:tol
SVDの値がゼロとみなされる閾値(しきい値)です。tol を指定しない場合(Noneの場合)、SをMの特異値を持つ配列、epsをSのデータ型におけるマシンイプシロン値とすると、tol = S.max() * max(M, N) * eps として自動的に設定されます。
第3引数:hermitian
Trueを指定すると、入力Aがエルミート行列(実対称行列を含む)であるとみなし、より効率的なアルゴリズムで特異値を計算できます。デフォルトはFalseです。
実装の手順
まず、必要なライブラリをインポートします。
import numpy as np
from numpy.linalg import matrix_rank
次に、サンプルとなる配列を作成します。ここでは5×5の単位行列を生成します。
arr = np.eye(5)
作成した配列を表示して確認しましょう。
print("Our Array...\n", arr)配列の次元数を確認します。
print("\nDimensions of our Array...\n", arr.ndim)配列オブジェクトのデータ型を取得します。
print("\nDatatype of our Array object...\n", arr.dtype)配列の形状(シェイプ)を確認します。
print("\nShape of our Array object...\n", arr.shape)最後に、numpy.linalg.matrix_rank() メソッドを使って、特異値分解による行列ランクを求めて表示します。
print("\nResult (rank)...\n", matrix_rank(arr))完全なコード例
import numpy as np
from numpy.linalg import matrix_rank
# 配列を作成
arr = np.eye(5)
# 配列を表示
print("Our Array...\n", arr)
# 次元数を確認
print("\nDimensions of our Array...\n", arr.ndim)
# データ型を取得
print("\nDatatype of our Array object...\n", arr.dtype)
# 形状を取得
print("\nShape of our Array object...\n", arr.shape)
# 特異値分解メソッドで行列ランクを返す
print("\nResult (rank)...\n", matrix_rank(arr))
実行結果
Our 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.]]
Dimensions of our Array...
2
Datatype of our Array object...
float64
Shape of our Array object...
(5, 5)
Result (rank)...
5
この例では、5×5の単位行列を作成したため、すべての特異値が1となり、行列ランクは「5」という結果が得られました。単位行列はフルランクであるため、ランクが行数・列数と一致するのは自然な結果です。
-
Pythonのmap()関数を使って2次元配列(2D配列)の合計を求める方法
このチュートリアルでは、Pythonのmap()関数を使って、2次元配列(リストのリスト)の合計を求める方法を解説します。 map()関数は、関数とイテラブル(反復可能オブジェクト)の2つの引数を受け取ります。イテラブルの各要素が関数に渡され、その結果はmapオブジェクトとして格納されます。mapオブジェクトはlist()などでイテラブルに変換できます。 処理の手順 リストを使って2次元配列を初期化します。 sum関数と2次元配列をmap()関数に渡します。 結果として得られるmapオブジェクトの合計を求めて出力します。 コード例 以下のコードを見てみましょう。 # 2次元配列の初期化 a
-
Pythonでソート済み2D行列を効率的に検索する方法(Search a 2D Matrix II)
問題の概要 m × n の行列が与えられたとき、その中から特定の値を効率的に検索するアルゴリズムを実装することを考えます。この行列には、以下のような性質があります。 各行の整数は、左から右に向かって昇順に並んでいる 各列の整数は、上から下に向かって昇順に並んでいる 行列の例 たとえば、次のような5×5の行列を考えてみましょう。 1471115 2581219 3691622 1013141724 1821232630 このとき、検索対象(target)が「5」であれば True を返し、「20」であれば False を返します。 アルゴリズムの考え方 この問題を効率的に解く鍵となるのは