【问题标题】:How to check if two NumPy arrays are approximately equal?如何检查两个 NumPy 数组是否近似相等?
【发布时间】:2021-11-15 23:41:43
【问题描述】:

np.isclose(或np.allclose)检查两个数组是否近似相等。但如果输入的形状不同,它们都会引发异常。我想知道是否有一个库函数可用于检查两个任意数组的“近似”相等性?即,类似

def allclose(x, y, *args, **kwargs):
    return x.shape == y.shape and np.allclose(x, y, *args, **kwargs)

事实上,对于“精确”相等,np.array_equal 已经完成了这项工作(通过在不同大小的数组上返回 False,而不是引发异常)。

【问题讨论】:

  • 你的解决方案有什么问题?
  • @NilsWerner 我的解决方案没有问题(我想)。但是我想知道这样的功能是否已经在 NumPy 库中实现了,这样我就不会每次需要这样的检查时都重新发明轮子。
  • 如果只是形状的问题,在比较之前不能把数组展平吗?
  • 考虑为好的答案投票

标签: arrays python-3.x numpy


【解决方案1】:

没有这样的功能,并且有一个特殊的原因:它允许广播。这意味着您可以比较两个不同形状的数组,只要它们是可广播的。

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

np.isclose(a, b)          # row-wise comparison
# array([[ True,  True],
#        [ True,  True]])
np.isclose(a, b[:, None]) # column-wise comparison
# array([[ True, False],
#        [False,  True]])

因此,如果您的函数允许广播,您想知道两个数组是否不同,或者只是形状不兼容。

所以如果你想保留广播能力,我建议

def allclose(x, y, *args, **kwargs):
    try:
        return np.allclose(x, y, *args, **kwargs)
    except ValueError:
        return False

【讨论】:

  • 关于保持可广播性的好点。不过,我认为您的 try 块错过了 return 声明或类似的东西。 (否则,如果 np.allclose 没有引发异常,则包装器 allclose 将不会返回任何内容。我说的对吗?)
  • 对,已修复
猜你喜欢
  • 2023-04-07
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 2016-09-13
相关资源
最近更新 更多