2014-02-06 25 views
0

我有一些數學運算,產生一個numpy結果數組,有8位有效數字。當我在我的陣列y_axis上使用tolist()時,它會創建我所假設的32位數字。爲什麼numpy數組的.tolist()創建長雙打?

但是,我不知道這是否只是垃圾。我認爲它垃圾,但它似乎足夠聰明,可以改變最後一個數字,以便四捨五入有意義。

print "y_axis:",y_axis 
y_axis = y_axis.tolist() 
print "y_axis:",y_axis 

y_axis: [-0.99636686 0.08357361 -0.01638707] 
y_axis: [-0.9963668578012771, 0.08357361233570479, -0.01638706796138937] 

所以我的問題是:如果這是垃圾,使用不tolist實際精度幫助我的計算,或者Python中始終使用整個數字,只是沒有顯示呢?

回答

1

當您在numpy數組上調用​​時,會得到numpy實際存儲在內部的數字的截斷版本。截斷方式取決於numpy打印選項的設置方式。

>>> arr = np.array([22/7, 1/13])   # init array 
>>> arr         # np.array default printing 
array([ 3.14285714, 0.07692308]) 
>>> arr[0]         # int default printing 
3.1428571428571428 
>>> np.set_printoptions(precision=24)  # increase np.array print "precision" 
>>> arr         # np.array high-"precision" print 
array([ 3.142857142857142793701541, 0.076923076923076927347012]) 
>>> float.hex(arr[0])      # actual underlying representation 
'0x1.9249249249249p+1' 

它看起來像你「獲得精確度」,當你打印出來的y_axis.tolist()版形式的原因是,默認情況下,當你的清單上調用print比當你調用print更多的數字印刷在一個numpy數組上。

在實際中,由任一列表或numpy的陣列存儲在內部的數字應該是相同的(並且應該對應於上面的最後一行,與float.hex(arr[0])生成),由於numpy的默認使用numpy.float64和Python float對象也64位默認情況下。

0

我的理解是,numpy沒有向您展示使矩陣始終如一的完整精度。該列表不應該比其對應的numpy.array更精確:

>>> v = -0.9963668578012771 
>>> a = numpy.array([v]) 
>>> a 
array([-0.99636686]) 
>>> a.tolist() 
[-0.9963668578012771] 
>>> a[0] == v 
True 
>>> a.tolist()[0] == v 
True