在Python中减去numpy数组时不需要的舍入

时间:2011-07-29 00:26:19

标签: python arrays numpy rounding subtraction

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

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

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

2 个答案:

答案 0 :(得分:6)

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

考虑上面的例子:

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 :(得分:1)

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

如果您需要这种精确度,那么您应该依赖于不同的东西,例如分数等。

我不知道是否已经有某些事情要处理,但是如果你能设法以不同的方式表示这些数字(例如1/100000000001/100000)然后计算浮动只在所有计算结束时指出结果,你应该避免所有这些问题。

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