如何比较numpy数组并忽略nan值?

3
我需要比较两个numpy数组是否相等,忽略nan值,精度为指定值。
例如:
a = [1,nan,3,nan]  
b = [1,0.2,3,4.1]  

需要通过测试。
我尝试使用numpy.all函数,但我知道它需要两个完全相同的数组。由于浮点值可能略有不同,因此我需要一些容差。
我该如何实现这一点?

2个回答

4
使用 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])
)

你想通过那个形状检查实现什么目的? - Paul Panzer
@PaulPanzer 看看疲劳让你做了什么...不幸的是,现在它有点像你的答案,所以如果你感到不舒服,请随意将其从我的答案中编辑出来。干杯。同时给你投一票。 - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接