2013-02-05 65 views
4

有人可以用numpy.linspace來解釋這個舍入問題嗎?NumPy linspace舍入錯誤

import numpy as np 

np.linspace(0, 1, 6) == np.around(np.linspace(0, 1, 6), 10) 
# array([ True, True, True, False, True, True], dtype=bool) 

以下是我來到這裏......

import numpy as np 

## Two ways of defining the same thing 
A = np.array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ]) 
B = np.linspace(0, 1, 6) 

## A and B appear to be the same 
A # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ]) 
B # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ]) 


## They're not 
A == B # array([ True, True, True, False, True, True], dtype=bool) 
A - B # array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.11022302e-16, 0.00000000e+00, 0.00000000e+00]) 


## Gotta round to get my expected result 
C = np.round(np.linspace(0, 1, 6), 10) 
C  # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ]) 
A == C# array([ True, True, True, True, True, True], dtype=bool) 

我定義B似乎很無辜的方式。 。 。這是一個什麼東西可以咬我們所有的地方?

回答

6

這不是很漂亮,但它的浮點方式是,你將不得不學會忍受它。這是你的怪異的結果來自:

>>> a = np.float(1) 
>>> a /= 5 
>>> a 
0.2 
>>> a*3 
0.6000000000000001 

你必須np.allclose來幫你處理這些東西,但是如果你沒有紀律有關浮點比較則是,它會一遍又一遍咬你。