Python中减去numpy数组时出现不必要的四舍五入

5 投票
2 回答
3638 浏览
提问于 2025-04-16 22:28

我在用Python做计算时遇到了一个问题,就是当我从一个小数(比如小于1e-8的数)中减去一个数组里的数时,Python会自动把这些很小的数四舍五入。举个例子:

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

有没有什么办法可以让Python不进行四舍五入?因为这样有时候会导致我出现除以零的情况,变得很麻烦。当我从一个numpy数组中减去数时,也会出现同样的问题。

2 个回答

1

我想这主要取决于Python和底层C库如何处理非常小的浮点数。当数值达到一定程度时,它们的精度可能会丢失。

如果你需要那么高的精度,我觉得你应该考虑其他方法,比如使用分数等。

我不知道现在是否已经有工具可以处理这个问题,但如果你能用其他方式表示这些数字(比如用1/100000000001/100000),然后在所有计算结束时再计算浮点结果,这样就能避免很多问题。

(当然,你需要一个可以自动处理分数计算的类,这样就不用重新实现公式等。)

6

主要是 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 的主要目的就是高效地存储相似数据的数组,所以它没有类似于 decimal 类的东西。

不过,64位浮点数的精度范围还是不错的。对于 1e-10 和 1e-5 这样的数值,你不会遇到太多问题。如果需要的话,还有 numpy.float128 这种数据类型,但使用它进行运算会比使用普通浮点数慢很多。

撰写回答