python - 如何防止 float 不精确影响 numpy.arange?

标签 python python-2.7 numpy floating-point

因为 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) 会是多少。

如果 startstopstep 浮点值,这是不可能做到的是可能发生一些舍入误差的操作结果。四舍五入会删除信息,并且根本无法从缺少信息中创建信息。

因此,只有当您有关于startstopstep 的额外信息时,这个问题才能解决。

假设 step 是精确的,但是 startstop 有一些累积误差,限制在 e0e1。也就是说,您知道 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 以及边界 e0e1

但是,根据您给出的示例,理想的 (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

如果您有此类信息,您可以使用您对startstopstep 中错误的了解来更新问题( 例如,也许它们中的每一个都是从十进制到 float 的单次转换的结果)以及理想(停止-开始)/step 的可能值。如果您没有此类信息,则没有解决方案。

关于python - 如何防止 float 不精确影响 numpy.arange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48755701/

相关文章:

python - 将 python dict 转换为 protobuf

python - 如何获取文件的父目录?

python - numpy 非整数网格

python - KNN - 我如何加速?

python - 在 Python 中格式化或简化长 bool 表达式?

Python 将一小时添加到 time.time()

python - Twisted 中的 OSError : [Errno 24] Too many open files when using reactor. run()

python - Pandas 数据框列值与列表中的元素明智数字比较

python - 将 1 层图像转换为 3 层图像

python - 使用 Python 的 OpenType