6

いくつかの計算中に精度を上げるために mpmath python ライブラリを使用していますが、結果を numpy ネイティブ型にキャストする必要があります。

より正確には、mpmath 行列 (mpf オブジェクト型を含む) を numpy.ndarray (float 型を含む) にキャストする必要があります。

私は生のアプローチで問題を解決しました:

# My input Matrix:

matr = mp.matrix(
[[ '115.80200375',  '22.80402473',   '13.69453064',   '54.28049263'],
[  '22.80402473',   '86.14887381',   '53.79999432',   '42.78548627'],
[  '13.69453064',   '53.79999432',  '110.9695448' ,   '37.24270321'],
[  '54.28049263',   '42.78548627',   '37.24270321',   '95.79388469']])

# multiple precision computation
D = MPDBiteration(matr)

# Create a new ndarray  
Z = numpy.ndarray((matr.cols,matr.rows),dtype=numpy.float)

# I fill it pretty "manually"
for i in range(0,matr.rows):
    for j in range(0,matr.cols):
        Z[i,j] = D[i,j] # or float(D[i,j]) seems to work the same

私の質問は:

それを行うためのより良い/よりエレガントな/より簡単な/賢い方法はありますか?

アップデート:

mpmath のドキュメントを何度も読んで、この非常に便利なメソッドtolist()を見つけました。次のように使用できます。

 Z = np.array(matr.tolist(),dtype=np.float32)

少し良くてエレガントに見えます(forループは必要ありません)

それを行うより良い方法はありますか?私の 2 番目の解決策は、余分な桁を丸めたり切り捨てたりしますか?

4

1 に答える 1

4

2番目の方法が推奨されますが、 np.float32 を使用すると、数値が単精度にキャストされます。あなたの行列では、この精度は低すぎます: 115.80200375 は切り捨てにより 115.80200195 になります。numpy.float64 で倍精度を明示的に設定するか、Python のfloat型を引数として渡すだけで、同じことを意味します。

Z = numpy.array(matr.tolist(), dtype=float)

または、マトリックス構造を維持するには、

Z = numpy.matrix(matr.tolist(), dtype=float)
于 2016-04-24T19:55:51.320 に答える