因为 numpy.arange()使用 ceil((stop - start)/step)
来确定项目的数量,一个小的 float 不精确 (stop = .400000001)
可以向列表添加一个意外的值.
例子
第一种情况不包含止损点(intended)
>>> print(np.arange(.1,.3,.1))
[0.1 0.2]
第二种情况包括停止点(无意)
>>> print(np.arange(.1,.4,.1))
[0.1 0.2 0.3 0.4]
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)
最佳答案
您的目标是计算如果使用精确的数学计算值,ceil((stop - start)/step)
会是多少。
如果 start
、stop
和 step
的仅 浮点值,这是不可能做到的是可能发生一些舍入误差的操作结果。四舍五入会删除信息,并且根本无法从缺少信息中创建信息。
因此,只有当您有关于start
、stop
和step
的额外信息时,这个问题才能解决。
假设 step
是精确的,但是 start
和 stop
有一些累积误差,限制在 e0
和 e1
。也就是说,您知道 start
最多 e0
远离其理想的数学值(在任一方向),而 stop
最多 e1
远离其理想值(在任一方向)。然后 (stop-start)/step
的理想值可以从 (stop-start-e0-e1)/step
到 (stop-start+e0 +e1)/step
远离其理想值。
假设(stop-start-e0-e1)/step
到(stop-start+e0+e1)/step
之间有一个整数。那么仅仅从start
,stop
的浮点值是不可能知道理想的ceil
结果应该是较小的整数还是较大的整数> 和 step
以及边界 e0
和 e1
。
但是,根据您给出的示例,理想的 (stop-start)/step
可能恰好是一个整数,如 (.4-.1)/.1
。如果是这样,任何非零误差界限都可能导致误差区间跨越一个整数,使得根据我们目前掌握的信息无法解决该问题。
因此,为了解决问题,您必须掌握更多的信息,而不仅仅是错误的简单界限。例如,您必须知道 (stop-start)/step
恰好是一个整数或以其他方式量化。例如,如果您知道步数的理想计算将产生 0.1 的倍数,例如 3.8、3.9、4.0、4.1 或 4.2,但绝不会是 4.05,并且误差足够小以至于 float -点计算 (stop-start)/step
的最终误差小于 .05,则可以将 (stop-start)/step
舍入到最接近的合格多个,然后对其应用 ceil
。
如果您有此类信息,您可以使用您对start
、stop
和step
中错误的了解来更新问题( 例如,也许它们中的每一个都是从十进制到 float 的单次转换的结果)以及理想(停止-开始)/step
的可能值。如果您没有此类信息,则没有解决方案。
关于python - 如何防止 float 不精确影响 numpy.arange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48755701/