Python Numpy Arange意外结果

我正在使用arange函数来定义我的for循环迭代并获得意外结果。


i = arange(7.8,8.4,0.05)

print i

满足以下条件:


[ 7.8   7.85  7.9   7.95  8.    8.05  8.1   8.15  8.2   8.25  8.3   8.35 8.4 ]

仍使用8.35的停止值,如下所示


i = arange(7.8,8.35,0.05)

产生以下


[ 7.8   7.85  7.9   7.95  8.    8.05  8.1   8.15  8.2   8.25  8.3 ]

但是我希望我的射程结束于8.35!我知道我可以使用> 8.35和<8.4的止损值来获得我的结果,但是为什么它与众不同并且在我看来不一致?


编辑:我正在使用2.7版


鸿蒙传说
浏览 724回答 3
3回答

一只萌萌小番薯

也许这与浮点数的限制有关。由于机器的精度,不可能将所有可能的值完美地存储为浮点数。例如:>>> 8.48.4000000000000004>>> 8.358.3499999999999996因此,作为浮点数的8.4略大于8.4的实际值,而作为浮点数的8.35则稍小一点。

MMTTMM

我猜想您正在看到浮点取整的效果。numpy.arange与python的功能相同range:它不包含“端点”。(例如range(0, 4, 2)将[0,2]代替[0,2,4])但是,对于浮点步长,舍入误差会累积,有时最后一个值实际上会包括端点。如文档中所述arange:当使用非整数步骤(例如0.1)时,结果通常将不一致。最好在linspace这些情况下使用。numpy.linspace在起点和终点之间生成指定数量的点。顺便说一句,默认情况下确实包含端点。

杨__羊羊

范围函数的帮助说&nbsp; &nbsp; For floating point arguments, the length of the result is&nbsp; &nbsp; ``ceil((stop - start)/step)``.&nbsp; Because of floating point overflow,&nbsp; &nbsp; this rule may result in the last element of `out` being greater&nbsp; &nbsp; than `stop`.对于python 2.7,现在在大多数平台上都可以正确舍入浮点数和字符串之间的转换。在2.7中>>> float(repr(2.3))2.3在2.6中>>> float(repr(2.3))2.2999999999999998
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python