2017-07-26 124 views
-3

當改變值我使用簡單的公式NumPy的切片

beta = covariance[0,1]/covariance[1,1] 

其中協方差是

[[ 1.96330748e-05 2.39329295e-05] 
[ 2.39329295e-05 1.05846999e-04]] 

當我打印

covariance[1,1] 

NumPy的返回0.000105846998912代替1.05846999e-04 ,更改數組中原始項的值,並且只有在運行此協變[1,1]語句時我纔會遇到此問題在我的終端。如果我在木星上運行相同的東西,它就可以工作。你可以幫我嗎?

+5

兩者是相同的。唯一的區別是*如何* numpy和Python重複浮點。 –

+0

是的,但爲什麼當我做協方差[0,1]我得到2.39329295e-05並且不能得到協方差[1,1]的1.05846999e-04? –

+0

因爲當值小於1e-4時,Python將使用科學記數法。編寫0.000000000011231211414相當難看。 –

回答

2

0.000105846998912等於1.05846999e-04

一個是科學記數法,另一個不是。

+0

是的結果,但是爲什麼當我做協方差[0,1]時我得到了2.39329295e-05並且不能得到協方差爲[1.0]的1.05846999e-04? –

1

大部分「浮點」都是錯誤的問題,與格式化和浮點內部表示之間的差異有關。計算機無法準確表示「格式化」的浮點數。

需要注意的是我使用的是什麼樣的浮點,例如在這裏,您可以檢查是否使用float32float64類型的數組。您可以通過鍵入檢查:

covariance.dtype 

您可以設置的值是如何使用從numpy的該set_printoptionsfunction打印的細節。還要確保您知道在不同的python版本中浮點值是如何被使用的printed

這是你所稱的「可重複性」的例子:

import numpy as np 
covariance = np.array(
    [ 
     [1.96330748e-05, 2.39329295e-05], 
     [2.39329295e-05, 1.05846999e-04] 
    ], 
    dtype="double" 
) 
print(covariance[1, 1]) 
print(repr(covariance[1, 1])) 
print("{:.20f}".format(covariance[1, 1])) 

beta = covariance[0, 1]/covariance[1, 1] 
print("{:.20f}".format(beta)) 

# this generates the "wrong" answer you mention in the comments under your answer. 
wrong_beta = covariance[0, 1]/covariance[0, 0] 
print("{:.20f}".format(wrong_beta)) 

如果我python3.5運行下jupyter我得到:

0.000105846999 
0.000105846999 
0.00010584699900000000 
0.22610872038044271815 
1.21901076340828695699 

如果我的python控制檯運行我得到相同的答案。

+0

Checked,float64,問題與打印不同,使用相同語法得出不同結果的公式存在問題,beta =協方差[0,1] /協方差[1,1] –

+2

@ArtYudin您沒有實際演示過... –