【问题标题】:Unwanted rounding when subtracting numpy arrays in Python在 Python 中减去 numpy 数组时不需要的舍入
【发布时间】:2011-07-29 00:26:19
【问题描述】:

当从单个浮点数中减去一个数组时,我遇到了 python 自动舍入非常小的数字(小于 1e-8)的问题。举个例子:

 import numpy as np
 float(1) - np.array([1e-10, 1e-5])

关于如何强制 python 不圆的任何想法?在某些情况下,这迫使我除以零,并成为一个问题。从 numpy 数组中减去时也会出现同样的问题。

【问题讨论】:

  • 我遇到了同样的问题,将小数提高到 1 的幂,并将它们四舍五入为 0。
  • 奇怪的是你投了反对票……这是个好问题,我。

标签: python arrays numpy rounding subtraction


【解决方案1】:

大多数情况下,只是 repr 的 numpy 数组在愚弄你。

考虑你上面的例子:

import numpy as np  
x = float(1) - np.array([1e-10, 1e-5]) 
print x
print x[0]
print x[0] == 1.0

这会产生:

[ 1.      0.99999 ]
0.99999999999
False

所以第一个元素实际上并不是零,它只是以这种方式显示的 numpy 数组的漂亮打印。

这可以通过numpy.set_printoptions.控制

当然,numpy 从根本上说是使用有限精度的浮点数。 numpy 的重点是成为类似数据数组的内存高效容器,因此 numpy 中没有 decimal 类的等价物。

但是,64 位浮点数具有不错的精度范围。 1e-10 和 1e-5 不会遇到太多问题。如果需要,还有一个 numpy.float128 dtype,但操作会比使用原生浮点数慢得多。

【讨论】:

  • 我没有想到这一点,但你是绝对正确的..永远不要只相信某事的简单表示! +1
【解决方案2】:

我猜这一切都取决于 Python 和底层 C 库对非常小的浮点数的处理,在某些时候往往会降低精度。

如果您需要那种级别的精度,恕我直言,您应该依赖一些不同的东西,例如分数等。

我不知道是否已经有东西可以处理,但如果你能设法以不同的方式表示这些数字(例如1/100000000001/100000),然后仅计算浮点结果所有计算结束,你应该避免所有这些问题。

(当然,您需要一些自动处理分数计算的类,以避免重新实现公式等)

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2014-12-18
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多