如何比较两个 NumPy 数组?


NumPy 是 Python 编程中广泛使用的库,它提供了有效且有用的数组操作方法。在开发过程中,经常会遇到需要比较两个 NumPy 数组的情况。这可能是为了验证是否存在相同的元素,或者检测它们之间的差异。

在本文中,我们将探讨比较两个 NumPy 数组的各种方法,包括基本比较运算符(如 ==)以及更高级的函数(如 numpy.array_equal() 和 numpy.setdiff1d())。我们的目标是全面了解如何在 Python 中比较 NumPy 数组,并指导您根据具体的比较需求选择合适的方法。

方法 1

使用 == 运算符比较两个数组是最简单的方法之一。此运算符检查输入数组中相同位置的元素,并返回一个布尔数组。在此数组中,每个元素表示输入数组中对应位置的元素是否相等。

以下是一个示例

示例

import numpy as np

a = np.array([1, 2, 3])
b = np.array([1, 2, 4])

print(a == b)

输出

[ True  True False]

在这种情况下,输出告诉我们数组的前两个元素相等,而第三个元素不相等。

此方法在比较两个形状相同的数组时很有用,但如果数组形状不同,则不起作用。

示例

以下是一个示例

import numpy as np

a = np.array([1, 2, 3])
b = np.array([1, 2])

print(a == b)

输出

False

在这种情况下,我们得到一个 ValueError,因为两个数组的形状不同,无法一起显示。

方法 2

另一个用于比较数组的有用函数是 numpy.array_equal()。此函数返回一个布尔输出,指示两个输入数组的形状和元素是否相同。

示例

以下是一个示例

import numpy as np

a = np.array([1, 2, 3])
b = np.array([1, 2, 3])
c = np.array([1, 2])

print(np.array_equal(a, b))

print(np.array_equal(a, c))

输出

True
False

在这种情况下,对 numpy.array_equal() 的第一次调用返回 True,因为两个数组的形状和元素相同。第二次调用返回 False,因为数组的形状不同。

虽然 numpy.array_equal() 是一个用于比较两个 NumPy 数组是否完全相等的实用函数,但在处理具有细微差异的数组时,它可能不是最佳方法。在这种情况下,numpy.allclose() 或其他方法可能更合适。

示例

以下是一个解释的示例

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = np.array([1.0000001, 2.0000001, 3.0000001])

print(np.array_equal(a, b))

输出

False

在这种特定情况下,两个数组几乎相同,但 numpy.array_equal() 仍然返回 False,因为值不完全相等。

方法 3

如果要检查一个数组中存在但另一个数组中不存在的元素,则使用 numpy.setdiff1d() 函数。通过比较两个数组,此函数返回在一个数组中存在但在另一个数组中不存在的元素。

示例

以下是一个示例

import numpy as np

a = np.array([1, 2, 3, 4, 5])
b = np.array([3, 4, 5, 6, 7])

print(np.setdiff1d(a, b))

print(np.setdiff1d(b, a))

输出

[1 2]
[6 7]

方法 4

如果我们想要比较可能存在细微差异的两个数组,可以使用 numpy.allclose() 函数。它返回一个布尔值,指示两个数组的所有元素是否在一定容差范围内相等。

示例

以下是一个示例

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = np.array([1.0000001, 2.0000001, 3.0000001])

print(np.allclose(a, b))

输出

True

在这种情况下,numpy.allclose() 返回 True,表示数组相同。

方法 5

如果要查找两个 NumPy 数组共有的元素,可以使用 numpy.intersect1d() 函数,它将只返回两个数组中都存在的元素。

示例

以下是一个示例

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([3, 4, 5, 6])

print(np.intersect1d(a, b))

输出

[3 4]

在这种情况下,numpy.intersect1d() 返回 a 和 b 中都存在的元素。

方法 6

比较两个 NumPy 数组的另一种方法是先对它们进行排序,然后使用 numpy.array_equiv() 函数逐元素进行比较。此函数检查两个数组的形状是否相同,以及在排序后它们的对应元素是否相等。

示例

以下是一个示例

import numpy as np

a = np.array([1, 2, 3])
b = np.array([2, 1, 3])

print(np.array_equiv(np.sort(a), np.sort(b)))

输出

True

在这种情况下,numpy.array_equiv() 返回 True,表示排序后的数组相等。

结论

总而言之,比较两个 NumPy 数组是许多科学和数据分析应用中的关键操作。通过利用本文中讨论的不同方法,您可以比较数组的相等性、相似性和差异,以应对各种场景。从简单的 == 运算符到更高级的 numpy.array_equiv() 函数,每种方法都有其自身的优缺点,使其适用于特定的用例。无论您是处理小型数据集还是大型数据集,NumPy 都提供了一套强大的工具来帮助您有效地操作和分析数据。通过将这些技术整合到您的 Python 代码中,您可以简化工作流程,并根据数据做出更明智的决策。

更新于: 2023年7月20日

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告