python numpy意外结果

sma*_*tic 18 python numpy

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

i = arange(7.8,8.4,0.05)
print i
Run Code Online (Sandbox Code Playgroud)

以下是:

[ 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 ]
Run Code Online (Sandbox Code Playgroud)

但使用8.35的停止值如下

i = arange(7.8,8.35,0.05)
Run Code Online (Sandbox Code Playgroud)

产生以下结果

[ 7.8   7.85  7.9   7.95  8.    8.05  8.1   8.15  8.2   8.25  8.3 ]
Run Code Online (Sandbox Code Playgroud)

但我希望我的范围以8.35结束!我知道我可以使用> 8.35和<8.4的停止值来实现我的结果,但为什么它不同并且在我看来,不一致?

编辑:我使用的是2.7版

Joe*_*ton 24

我猜你正在看到浮点舍入的影响.

numpy.arange做与python相同的事情range:它不包括"端点".(例如range(0, 4, 2)将屈服[0,2]而不是[0,2,4])

但是,对于浮点步骤,舍入错误会累积,有时最后一个值实际上会包含端点.

如以下文档中所述arange:

当使用非整数步骤(例如0.1)时,结果通常不一致.最好linspace用于这些情况.

numpy.linspace在起点和终点之间生成指定数量的点.顺便提一下,它默认包含端点.


Bre*_*ood 10

也许它与浮点数的限制有关.由于机器精度,不可能将每个可想到的值完美地存储为浮点.例如:

>>> 8.4
8.4000000000000004
>>> 8.35
8.3499999999999996
Run Code Online (Sandbox Code Playgroud)

因此,8.4作为浮点稍微大于8.4的实际值,而作为浮点的8.35稍微小一点.

  • 它确实如此,这很有趣.看起来他们已经改变了浮点数的打印方式,虽然底层数字仍然相同(稍微不正确),你可以通过比较Python 2.6和2.7中浮点数的十六进制值来看到. (4认同)

ava*_*sal 5

arange 函数的帮助说

    For floating point arguments, the length of the result is
    ``ceil((stop - start)/step)``.  Because of floating point overflow,
    this rule may result in the last element of `out` being greater
    than `stop`.
Run Code Online (Sandbox Code Playgroud)

对于 python 2.7,浮点数和字符串之间的转换现在可以在大多数平台上正确舍入。

在2.7中

>>> float(repr(2.3))
2.3
Run Code Online (Sandbox Code Playgroud)

在2.6中

>>> float(repr(2.3))
2.2999999999999998
Run Code Online (Sandbox Code Playgroud)