如何比较忽略nans的numpy数组? [复制]

Posted

技术标签:

【中文标题】如何比较忽略nans的numpy数组? [复制]【英文标题】:How to compare numpy arrays ignoring nans? [duplicate] 【发布时间】:2018-08-21 02:33:39 【问题描述】:

我需要比较两个 numpy 数组是否等于忽略 nan 值的所需精度。 例如:

a = [1,nan,3,nan]  
b = [1,0.2,3,4.1]  

应该通过测试。 我试过使用 numpy.all 函数,但我知道它期望两个数组相同,我需要有一些容忍度,因为浮点值可能会有所不同。 我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

整数数组 使用np.isfinite 屏蔽您的数组并与np.array_equal 进行比较:

def array_nan_equal(a, b):
    m = np.isfinite(a) & np.isfinite(b)
    return np.array_equal(a[m], b[m])

assert array_nan_equal(
     np.array([1, np.nan, 3, np.nan]), np.array([1, 2, 3, 4])
)
assert not array_nan_equal(
     np.array([1, 4, 3, np.nan]), np.array([1, 2, 3, 4])
)

请注意,如果您想考虑 +/-inf,您可以按照@Paul Panzer 的回答中的提示使用m = ~(np.isnan(a) & np.isnan(b)) 而不是np.isfinite


浮点数组 对于浮点数,您需要在容差范围内进行比较,因此将 np.array_equal 替换为对 np.allclose 的调用:

def array_nan_close(a, b):
    m = np.isfinite(a) & np.isfinite(b)
    return np.allclose(a[m], b[m])

assert array_nan_close(
     np.array([1.3, np.nan, 3.4, np.nan]), np.array([1.3000001, 2, 3.4, 4])
)
assert not array_nan_close(
     np.array([1.1, 4.0, 3.5, np.nan]), np.array([1, 2, 3, 4])
)

【讨论】:

您究竟想通过形状检查实现什么目标? @PaulPanzer 看看累了会让你做什么......不幸的是,现在它与你的答案有点相似,所以如果你对它感到不舒服,请随时从我的答案中编辑它.干杯。还给你投票。【参考方案2】:

使用np.allclosenp.isnan

mask = ~(np.isnan(a) | np.isnan(b))
np.allclose(a[mask], b[mask])

这可以正确处理+/- inf 并允许存在小的差异。绝对和相对公差可以指定为allclose 的参数。

【讨论】:

以上是关于如何比较忽略nans的numpy数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法让 numpy.argmin() 忽略 NaN 值

比较 NumPy 数组以便 NaN 比较相等

Python\Numpy:将数组与 NAN 进行比较 [重复]

numpy中处理含nan数据的统计函数及其效率

numpy 数组与 nan 与标量的不等式比较

如何获取numpy数组中所有NaN值的索引列表?