2017-10-10 75 views
0

在下面的代碼片段中,128.99包含在輸出中,按照定義它不應該。這是一個錯誤嗎?測試了python2和python3。`np.mgrid`可能的錯誤?

In [38]: np.mgrid[119.99:128.99, 0:2] 
Out[38]: 
array([[[ 119.99, 119.99], 
    [ 120.99, 120.99], 
    [ 121.99, 121.99], 
    [ 122.99, 122.99], 
    [ 123.99, 123.99], 
    [ 124.99, 124.99], 
    [ 125.99, 125.99], 
    [ 126.99, 126.99], 
    [ 127.99, 127.99], 
    [ 128.99, 128.99]], 

    [[ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ]]]) 
+2

它的浮點運算。舍入誤差是正常的。如果你想要一個浮點範圍,你應該使用'linspace'或'mgrid'的複合步驟形式。 – user2357112

回答

2

np.mgrid用兩個參數調用將填充相應範圍內的項目從開始到停止。

要確定的步驟的數目,使用的是式(見source):

math.ceil((key[k].stop - start)/(step*1.0)) 

其中步驟是1默認。在你的情況下,stop-start是9.000000000000014,這樣由ceil函數舍入產生10步,第1步:119.99 + 9 = 128.99

所以這裏沒有錯誤。

如果依靠MGRID項目的數量,使用複雜的階躍折射率:

np.mgrid[119.99:127.99:9j, 0:2]. 

提防,現在的「停止」點是包容的,每docs

+0

總之,這個問題是由1)'浮點'表示的舍入誤差造成的2)整數步數是由'ceil'函數產生的。因此,非常小的舍入錯誤可能導致不同的步數。 PS:'decimal.Decimal()'可以用來檢查'float'的確切值 – beaver