NumPy は LAPACK の下位上位分解ルーチンによって行列式を計算します。このルーチンは、浮動小数点数のみを処理できます。
行列の行列式を計算する前に、行列にlinalg.det
含まれる値のタイプをチェックし、 という名前の関数の呼び出しを使用して実行する必要がある内部ループのタイプを確立します_commonType()
。この関数は、ループを double または complex-double 値のいずれかに対して実行するように設定します。
linalg.det
チェックを処理する関数の Python 部分を次に示します。
def det(a):
a = asarray(a) # convert matrix to NumPy array
_assertNoEmpty2d(a)
_assertRankAtLeast2(a)
_assertNdSquareness(a)
t, result_t = _commonType(a) # input/output types established here
signature = 'D->D' if isComplexType(t) else 'd->d' # signature 'float->float' chosen
return _umath_linalg.det(a, signature=signature).astype(result_t)
行列の形状のチェックを実行して型を決定した後、return
行は配列内の値を上下分解の LAPACK 実装に渡し、float が返されます。
独自の型シグネチャでこの型チェックをバイパスしようとすると、オブジェクト型に対してそのようなループが定義されていないというエラーが発生します。
>>> np.linalg._umath_linalg.det(a, signature='O->O') # 'O' is 'object'
TypeError: No loop matching the specified signature was found for ufunc det
Fraction
これは、 を使用するときに型を戻り値の型として保持できないことを意味しdet
ます。
などの他の関数trace()
は、 と同じタイプ チェックを行わずdet
、オブジェクト タイプが保持される場合があります。オブジェクトのメソッドtrace
を呼び出して対角線を単純に合計するため、オブジェクトを戻り値の型として保持できます。Fraction
__add__
Fraction
行列式を有理数として計算したい場合は、SymPy を調べることができます。行列式の計算などの行列演算については、こちらに記載されています。