2014-12-18 62 views
1

我比較兩個陣列中以交互的IPython之間不同,則返回是 正確:數組運算結果的交互式和節目

在[143]:R = np.array([0,0.04166667,0.08333333 ,0.125,0.16666667, 0.20833333,0.25,0.29166667,0.33333333,0.375,0.41666667,0.45833333,0.5%,0.54166667,0.58333333,0.625,0.66666667,0.70833333,0.75,0.79166667,0.83333333,0.875 0.91666667,0.95833333])

In[144]: c=np.array([ 0., 0.04166667, 0., 0., 0., 0.20833333, 0., 0.29166667 , 0., 0. , 0., 0.45833333, 0.,  0.54166667, 0. , 0. , 0.,0.70833333, 0. , 0.79166667 , 0., 0., 0., 0.95833333]) 

In [145]: c==r 

Out[145]: 
array([ True, True, False, False, False, True, False, True, False, 
     False, False, True, False, True, False, False, False, True, 
     False, True, False, False, False, True], dtype=bool 

但在 '相同' 的設置python程序,結果是不正確的:

turns=1 

r = np.linspace(1/24, turns, 24*turns,endpoint=False) 

rr=r%1 

c=np.array([0.,0.04166667,0,0,0,0.20833333,0,0.29166667,0,0,0,0.45833333, 
0,0.54166667,0,0,0,0.70833333,0,0.79166667,0,0,0,0.95833333]) 

cc=np.tile(c,turns) 

print([rr==cc]) 

的結果是不同的:

[array([ True, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False], dtype=bool)] 

什麼錯誤沒我做? 您的幫助表示讚賞。

回答

1

這是浮點精度的問題;你的第一和第二種情況確實是不一樣Floating Point guide在這裏是一個有用的資源。

在第一個實例中,您將從浮點文字中填充兩個數組,然後直接比較它們。在第二種情況下,您正在使用numpy函數的輸出,並直接將其與第二個數組進行比較,該數組仍然是由文字創建的。

即使顯示函數輸出的版本看起來相同,實際的數字比這更精確,這足以推翻==的比較;您應該(幾乎)從不首先使用浮點數的平等比較。

一個簡單的例子:

>> print 0.1 + 0.2 
0.3 
>> 0.1 + 0.2 
0.30000000000000004 
1

作爲回答,這是一個浮點問題。一個解決方案是使用np.isclose

In [11]: np.isclose(rr, cc) 
Out[11]: 
array([ True, True, False, False, False, True, False, True, False, 
     False, False, True, False, True, False, False, False, True, 
     False, True, False, False, False, True], dtype=bool) 

此檢查值是否在彼此的蒂內(默認1E-8):

In [12]: cc[1] 
Out[12]: 0.041666670000000003 

In [13]: rr[1] 
Out[13]: 0.041666666666666664 

In [14]: cc[1] == rr[1] 
Out[14]: False 

In [15]: rr[1] + 1e-8 > cc[1] 
Out[15]: True