2016-09-30 38 views

回答

1

這是因爲在這個範圍內,它實際上1.2500000000000002沒有1.25那是因爲numpy的默認,並在案件小數不能完全按照二進制小數表示考慮了雙精度浮點數對浮點數,它們可以容納更準確花車的價值。您在打印結果中看到的只是實際值的格式化表示。爲解決該

In [58]: l = np.arange(1,2,0.05) 

In [59]: l[5] 
Out[59]: 1.2500000000000002 

In [60]: type(l[5]) 
Out[60]: numpy.float64 

一種方法是鑄造類型float32

In [61]: l = np.arange(1,2,0.05).astype(np.float32) 

In [62]: a = 1.25 

In [63]: type(a) 
Out[63]: float 

In [64]: a in l 
Out[64]: True 
+1

*「十進制小數不能完全表示爲二進制分數」* - 對於數組中的值與其進行比較(也將是64位浮點數)的文字「1.25」同樣適用。我認爲問題是*步長*不能完全表示爲二進制分數。例如,np.arange(1,2,2 ** - 4)中的'1.25'== True。 –

+0

@ali_m是的,謝謝澄清,但正如我所說它是「小數分數」,並且在添加該步驟後出現,原因可能是步驟或結果。 – Kasramvd

0

使用item全面輝煌打印值:

In [83]: for i in np.arange(1,2,0.05):print(i.item()) 
1.0 
1.05 
1.1 
1.1500000000000001 
1.2000000000000002 
1.2500000000000002 
1.3000000000000003 
1.3500000000000003 
1.4000000000000004 
1.4500000000000004 
1.5000000000000004 
1.5500000000000005 
1.6000000000000005 
1.6500000000000006 
1.7000000000000006 
1.7500000000000007 
1.8000000000000007 
1.8500000000000008 
1.9000000000000008 
1.9500000000000008 

即使linspace有這些額外的數字送行結束:

In [84]: for i in np.linspace(1,2,21):print(i.item()) 
1.0 
1.05 
1.1 
1.15 
1.2 
1.25 
1.3 
1.35 
1.4 
1.45 
1.5 
1.55 
1.6 
1.65 
1.7000000000000002 
1.75 
1.8 
1.85 
1.9 
1.9500000000000002 
2.0 

in==測試並不是一個好主意,當使用浮動。

iscloseallclose測試小的差異,而不是精確匹配

In [89]: np.isclose(np.arange(1,2,0.05),1.25) 
Out[89]: 
array([False, False, False, False, False, True, False, False, False, 
     False, False, False, False, False, False, False, False, False, 
     False, False], dtype=bool) 
In [90]: np.isclose(np.arange(1,2,0.05),1.25).any() 
Out[90]: True 

看那isclose代碼,看看所有參與比較浮動。

相關問題