numpy arange意想不到的结果

yc0p9oo0  于 2023-10-19  发布在  其他
关注(0)|答案(5)|浏览(113)

我使用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来实现我的结果,但为什么它是不同的,在我的脑海中,不一致?
编辑:我正在使用Python 2.7

tcbh2hod

tcbh2hod1#

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

lh80um4z

lh80um4z2#

也许这与浮点数的限制有关。由于机器的精度,不可能将所有可能的值都完美地存储为浮点数。举例来说:

>>> 8.4
8.4000000000000004
>>> 8.35
8.3499999999999996

因此,8.4作为浮点数比8.4的实际值稍大,而8.35作为浮点数要小一点点。

5hcedyr0

5hcedyr03#

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`.

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

>>> float(repr(2.3))
2.3

python 2.6中

>>> float(repr(2.3))
2.2999999999999998
d5vmydt9

d5vmydt94#

我也遇到了同样的问题,我实现了自己的函数来纠正numpy.arange的舍入问题:

import numpy as np
def my_arange(a, b, dr, decimals=6):
    res = [a]
    k = 1
    while res[-1] < b:
        tmp = round(a + k*dr,decimals)
        if tmp > b:
            break   
        res.append(tmp)
        k+=1

    return np.asarray(res)
oyjwcjzk

oyjwcjzk5#

向端点添加一点校正浮动:

import numpy as np

step = 0.05
corr = 0.01 if step == 0.05 else 0.0

i = np.arange(7.8,8.35+corr,step)
print(i)

输出:

$ python a.py [7.8 7.85 7.9 7.95 8.[8.05 8.15 8.2 8.25 8.3 8.35]

相关问题