2016-07-27 19 views
0

NumPy浮動小数点配列の要素の精度は、マシンのεによって制限されることを理解しています。精度差:NumPyオブジェクト配列と浮動小数点配列

しかし、配列のデータ型をデフォルトの浮動小数点数ではなくPythonオブジェクトとして指定すると、結果として配列に正確な値が格納されることになります。誰かがこの行動を説明できますか?

以下のコードは、floatデータ型に関連する丸め誤差と、オブジェクトデータ型を使用するときの精度の変更を示しています。

import numpy as np 

np.set_printoptions(precision=64) 

MyArray = np.empty(2) 
MyArray.fill(0.442) 
print(MyArray) 

# [ 0.442000000000000003996802888650563545525074005126953125 
# 0.442000000000000003996802888650563545525074005126953125] 

MyArray_precise = np.empty(2, dtype = object) 
MyArray_precise.fill(0.442) 
print(MyArray_precise) 

# [0.442 0.442] 

私は32ビットPython 2.7.12インストールを64ビットWindows上で実行しています。

答えて

3

これは表示フォーマットの問題です。あなたは実際にどちらの方法でもより正確な数字を得ているわけではありません。設定したprecision=64の表示設定がオブジェクト配列に適用されないことだけです。浮動小数点dtypeの配列にのみ適用されます。

あなたがMyArray_preciseの内容の桁以上印刷する場合:

print(format(MyArray_precise[0], '.64')) 
# 0.442000000000000003996802888650563545525074005126953125 

をあなたはそれが実際に他のアレイよりも良くないことがわかります。

0

フロートに関する問題は、正確ではなく表示の問題であることに同意します。

しかし、長い整数には別の問題があります。 Pythonには、numpy dtypeを持たない長い整数型があります。

In [87]: x=12312312312311231231241241242342 
In [88]: x 
Out[88]: 12312312312311231231241241242342 

これはPy3です。 Py2は、12312312312311231231241241242342L

In [90]: np.array([x]) 
Out[90]: array([12312312312311231231241241242342], dtype=object) 
In [91]: np.array([x],int) 
.... 
OverflowError: Python int too large to convert to C long 
関連する問題