如何比较忽略nans的numpy数组?

问题描述 投票:0回答:2

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

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

应该通过测试。 我已经尝试使用numpy.all函数,但我知道它期望两个数组相同,我需要有一些容差,因为浮点值可能会略有不同。 我怎样才能实现这一目标?

python arrays numpy comparison
2个回答
1
投票

使用np.allclosenp.isnan

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

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


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])
)
© www.soinside.com 2019 - 2024. All rights reserved.