2016-07-27 138 views
0

我知道NumPy浮點數組元素的精度受機器epsilon的限制。精度差異: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] 

我在64位Windows上運行32位Python 2.7.12安裝。

回答

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