python - 稳健的 numpy.float64 相等性测试

标签 python numpy floating-point precision floating-accuracy

是否有一种可靠的方法来测试 float 的相等性,或者通常确保应该相等的 float 实际上在 float 的精度范围内彼此相等?例如,这是一个令人痛苦的情况:

>> np.mod(2.1, 2) == 0.1
Out[96]: False

我意识到这是由于浮点错误而发生的:

>> np.mod(2.1, 2)
Out[98]: 0.10000000000000009

我熟悉 np.isclose(a,b,tol) 函数,但使用它让我感到不舒服,因为我可能会得到误报,即被告知事物实际上是平等的不应该是。还有一点需要注意的是,np.isclose(a,b)可能与np.isclose(b,a)不同,这甚至更糟。

我想知道,是否有一种更可靠的方法来确定 float 的相等性,没有误报/漏报,并且 a==bb==a 不同code> 并且不必搞乱公差?如果不是,设置容差以确保稳健行为的最佳实践/建议是什么?

最佳答案

您说过,如果它们的无限精度形式相等,您希望检查返回 True。在这种情况下,您需要使用无限精度的数据结构。例如fractions.Fraction :

>>> from fractions import Fraction
>>> Fraction(21, 10) % 2 == Fraction(1, 10)
True

还支持(虽然很慢!)包含 python 对象的数组:

>>> import numpy as np
>>> arr = np.array([Fraction(1, 10), Fraction(11, 10), Fraction(21, 10), 
...                 Fraction(31, 10), Fraction(41, 10)])
>>> arr % 2 == Fraction(1, 10)
array([ True, False,  True, False,  True], dtype=bool)

您只需确保不会丢失无限精度对象(这对于多个 numpy/scipy 函数来说并不容易)。

在您的情况下,您甚至可以只对整数进行操作:

>>> 21 % 20 == 1
True

关于python - 稳健的 numpy.float64 相等性测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44077308/

相关文章:

pythonic 风格过滤 csv 中的数据

floating-point - 浮点精度位

python - 我想在我的数据框中创建一个新列,即每个特定行的犯罪率

c++ - C++ (GCC) 中的四倍精度

c - 当除以一个小的负数时,我只得到 0

python - 为什么我的 Docker 容器内的 pip 不安装预编译的包?

python - 为并不总是有响应的 View 禁用 Django CSRF

python - XlsxWriter 和 Python 继承

python - Scipy 给出矩阵乘法的错误结果

python - 根据随机选择的列生成随机天数