2017-10-10 79 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