numpy arange 意外结果
- 2025-03-05 09:16:00
- admin 原创
- 107
问题描述:
我正在使用 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
解决方案 1:
我猜你看到了浮点舍入的效果。
numpy.arange
与 python 的功能相同range
:它不包括“端点”。(例如,range(0, 4, 2)
将产生[0,2]
而不是[0,2,4]
)
然而,对于浮点步骤,舍入误差会累积,有时最后一个值实际上会包含端点。
正如文档中所述arange
:
当使用非整数步长(例如 0.1)时,结果通常不一致。
linspace
对于这些情况,最好使用它。
numpy.linspace
在起点和终点之间生成指定数量的点。顺便说一句,它默认包含端点。
解决方案 2:
也许这与浮点数的限制有关。由于机器精度的原因,不可能将所有可以想到的值都完美地存储为浮点数。例如:
>>> 8.4
8.4000000000000004
>>> 8.35
8.3499999999999996
因此,浮点数 8.4 略大于实际值 8.4,而浮点数 8.35 则略小一点。
解决方案 3:
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
在 2.6
>>> float(repr(2.3))
2.2999999999999998
解决方案 4:
我遇到了同样的问题,并实现了自己的函数来纠正 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)
解决方案 5:
在端点添加一点校正浮点数:
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.1 8.15 8.2 8.25 8.3 8.35]
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD