Python中的NumPy.isclose()方法

2025年3月5日 | 阅读 4 分钟

NumPy.isclose() 方法在 Python 中的介绍

NumPy 是一个用于数值计算的现代 Python 包。它支持数组、矩阵以及各种数值函数和操作。一个有用的 NumPy 方法是 `isclose()`,它在给定的容差范围内确定两个数组是否逐元素接近。该函数在处理浮点数时特别有用,因为直接相等比较可能会由于浮点数精度问题而产生错误的结果。

NumPy 中的 `isclose()` 方法用于确定两个数组是否在给定容差范围内逐元素接近。它返回一个布尔数组,指示元素是否接近。`isclose()` 的语法如下:

语法

  • 输入数组 `array_ex1_` 和 `array_ex2_` 用于比较它们的接近程度。
  • 比较的容差由可选参数 `rtol`(相对容差)和 `atol`(绝对容差)确定。默认情况下,它们分别设置为 `'1e-05'` 和 `'1e-08'`。
  • `equal_nan` 是一个布尔标志,用于确定是否将 NaN(非数字)视为相等。默认情况下,它设置为 `'False'`,这意味着 NaN 不被视为相等。

以下是使用 `isclose()` 的简单示例:

代码

输出

 
[ False False False]   

在此示例中,`array_ex1_` 和 `array_ex2_` 被逐元素进行比较。第一个元素被认为是接近的,因为它等于默认容差。但是,第二和第三个元素不被视为接近,因为它们的差值在容差范围内。结果是表示每对元素接近程度的布尔数组。

让我们深入了解 `isclose()` 函数的参数,并看一些更多示例:

相对容差 ('rtol')

  • 相对容差 (`rtol`) 用于计算两个项之间的相对差。
  • 对于 `rtol`,默认值为 `'1e-05'`。
  • 如果使用 `rtol`,则比较的容差计算为 `'rtol * max(abs(a), abs(b))`。
  • 这意味着比较的容差随所考虑的两个因素中较大者的绝对值而增加。

绝对容差 ('atol')

  • 绝对容差 (`atol`) 用于计算两个元素之间的绝对差。
  • `atol` 的默认值为 `'1e-08'`。
  • 如果提供了 `atol`,它将被添加到由 `rtol * max(abs(a), abs(b))` 计算的容差中。

相等 NaN ('equal_nan')

  • 如果 `equal_nan` 设置为 `'True'`,则 NaN 值被视为相等。
  • NaN(非数字)是一种特殊的浮点值,表示不确定或无法表示的值。
  • 以下是一个更广泛的示例,说明了不同容差参数的影响:

代码

输出

 
[True, True, True]   

在此示例中

  • 前两个元素被认为是接近的,因为它们的绝对差在规定的范围内。
  • 第三个元素(NaN)被视为相等,因为 `equal_nan` 设置为 `'True'`。

更改 `rtol` 和 `atol` 选项允许您根据所比较数字的大小来控制比较的灵敏度。将 `equal_nan` 设置为 `'True'` 在处理包含 NaN 值的 数据集时也很有用。

浮点数算术

  • 计算机使用 IEEE 754 等有限精度的浮点格式来表示实数。
  • 由于浮点表示的精度有限,会发生舍入误差。
  • 因此,由于舍入错误,直接比较浮点数的相等性可能会产生意外的结果。

需要基于容差的比较

  • 基于容差的比较决定两个值之间的绝对差或相对差是否在可接受的范围内。
  • NumPy 的 `isclose()` 函数可以方便地对数字数组进行基于容差的比较。

性能考虑

  • 基于容差的比较可能比直接相等比较在计算上更耗费资源。
  • 相应地调整容差设置(`rtol` 和 `atol`)以平衡准确性和性能。
  • 可以为大型数组或性能关键型应用程序优化容差参数以提高效率。

总之,NumPy 在 Python 中的 `isclose()` 函数提供了一种可靠的方法来对数组进行逐元素比较,特别是在处理浮点数时。通过引入基于容差的比较程序,`isclose()` 解决了浮点数算术固有的限制,即由于舍入错误,直接相等比较可能会产生意外的结果。能够自定义容差参数,例如相对(`rtol`)和绝对(`atol`)容差,可以根据所考虑值的幅度对比较的灵敏度进行更精细的控制。此外,处理 NaN 值(`equal_nan`)的能力提高了 `isclose()` 在存在缺失或未定义数据时的可用性。理解基于容差的比较的底层原理对于在各种数值计算任务中有效地使用 `isclose()` 至关重要,可确保准确可靠的结果,同时优化速度。