如何防止浮动不精确影响numpy.arange?

Bre*_*ick 6 python floating-point numpy python-2.7

因为numpy.arange()用于ceil((stop - start)/step)确定项目的数量,所以小的浮点精度(stop = .400000001)可能会向列表中添加一个意想不到的值。

例子

第一种情况不包括停止点(拟)

>>> print(np.arange(.1,.3,.1))
[0.1 0.2]
Run Code Online (Sandbox Code Playgroud)

第二种情况包括停止点(非预期)

>>> print(np.arange(.1,.4,.1))
[0.1 0.2 0.3 0.4]
Run Code Online (Sandbox Code Playgroud)

numpy.linspace()解决了这个问题,np.linspace(.1,.4-.1,3)。但要求您知道步骤数。np.linspace(start,stop-step,np.ceil((stop-step)/step))导致相同的不一致。

如何在float不知道范围内元素数量的情况下生成可靠范围?

极端情况

考虑我想要生成未知精度的浮点索引的情况

np.arange(2.00(...)001,2.00(...)021,.00(...)001)
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 6

你的目标是计算ceil((stop - start)/step)如果这些值是用精确的数学计算出来的。

考虑 , 的浮点值,这是不可能做到的startstop并且step这是可能发生一些舍入错误的运算的结果。四舍五入会删除信息,并且根本无法从缺乏信息中创建信息。

因此,这个问题只是解决的,如果你有关于其他信息startstop以及step

假设step是准确的,但startstop已经被包围了一些累积误差e0e1。也就是说,您知道start最多e0偏离其理想的数学值(在任一方向上),stop最多e1偏离其理想值(在任一方向上)。那么 的理想值(stop-start)/step可能会从(stop-start-e0-e1)/step(stop-start+e0+e1)/step远离其理想值。

假设(stop-start-e0-e1)/stepto之间有一个整数(stop-start+e0+e1)/step。然后,它是不可能知道是否理想的ceil结果应该是刚从的浮点值较小的整数或更大startstop以及step和界限e0e1

但是,根据您给出的示例,理想值(stop-start)/step可能恰好是一个整数,如(.4-.1)/.1. 如果是这样,任何非零误差界限都可能导致误差区间跨越一个整数,从而无法根据我们目前掌握的信息解决问题。

因此,为了解决这个问题,你必须有更多的信息,而不仅仅是错误的简单界限。例如,您必须知道这(stop-start)/step恰好是一个整数或以其他方式量化。例如,如果您知道步数的理想计算会产生 0.1 的倍数,例如 3.8、3.9、4.0、4.1 或 4.2,但绝不会是 4.05,并且误差足够小以至于浮动 -点计算(stop-start)/step的最终误差小于 0.05,则可以四舍五入(stop-start)/step到最接近的合格倍数,然后应用ceil到该倍数。

如果你有这样的信息,你可以更新你知道在错误什么的问题startstopstep例如,也许他们每个人都是从十进制浮点单次转换的结果)和理想的可能值(stop-start)/step. 如果您没有此类信息,则没有解决方案。


小智 -2

您可以使用该函数在 Python 中将数字舍入到任意精度format

e例如,如果您想要小数点后的前三位数字,您可以运行

float(format(np.e, '.3f'))
Run Code Online (Sandbox Code Playgroud)

使用它可以消除浮动不精确性,您应该可以开始工作。