4

有理行列に対して操作を実行したい。モジュールnumpyとを使用しますfractions

これが私のコードです:

import numpy as np
from fractions import Fraction

m=np.matrix([[Fraction(1, 6), Fraction(8, 7)], [Fraction(1, 2), Fraction(3, 2)]])
print(np.linalg.det(m))
# Gives -0.321428571429

print(m[0,0]*m[1,1] - m[0,1]*m[1,0])
# Gives -9/28

行列式の計算にはガウス法による有理演算のみが必要なので、有理行列の行列式は有理です。

だから私の質問は: numpy が Fraction ではなく float を返すのはなぜですか? どうすれば合理的な行列式を取得できますか?

この行列に対する他の操作は、有理数の出力を与えることに注意してください (たとえば、m.trace())。

4

2 に答える 2

5

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 を調べることができます。行列式の計算などの行列演算については、こちらに記載されています。

于 2015-03-21T12:36:57.403 に答える
1

これは簡単に解決できる問題ではなく、np.linalgほとんどの操作を lapack に依存しているという事実の制限であると思われます。ソースコードを見ると、numpy.linalg呼び出されたルーチン_commonTypeが lapack ルーチンを呼び出す前に呼び出されているようです。これは、入力配列に含まれるデータの適切な型を見つけようとしますが、型を判別できない場合は、型が であると想定しdoubleます。配列は、lapack ルーチンに渡される前に、結果の型にキャストされます。これは、渡される可能性のあるすべてのタイプを処理することは不可能に近いため、行われた可能性があります。

私はパッケージを扱ったことがないので、オブジェクトFractionのマトリックスに戻るための実行可能な解決策を提供することはできません. Fractionに電話することを提案するつもりでしm.astype(Fraction)たが、それでもうまくいかないようです。

  • リスト項目
于 2015-03-21T12:39:43.923 に答える