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

问题描述:

我正在使用 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]

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3975  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2742  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   80  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   88  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   77  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用