`np.mgrid`可能的错误?
问题描述:
在下面的代码片段中,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. ]]])
答
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
它的浮点运算。舍入误差是正常的。如果你想要一个浮点范围,你应该使用'linspace'或'mgrid'的复合步骤形式。 – user2357112