Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何比较忽略NAN的numpy阵列?_Python_Arrays_Numpy_Comparison - Fatal编程技术网

Python 如何比较忽略NAN的numpy阵列?

Python 如何比较忽略NAN的numpy阵列?,python,arrays,numpy,comparison,Python,Arrays,Numpy,Comparison,我需要比较两个numpy数组是否等于所需的精度(忽略nan值)。 例如: a = [1,nan,3,nan] b = [1,0.2,3,4.1] 应该通过测试。 我尝试过使用numpy.all函数,但我知道它需要两个相同的数组,并且我需要有一些公差,因为浮点值可能会略有不同。 如何实现这一点?整数数组 使用np.isfinite屏蔽数组,并与np.array_equal进行比较: def array_nan_equal(a, b): m = np.isfinite(a) &am

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

a = [1,nan,3,nan]  
b = [1,0.2,3,4.1]  
应该通过测试。
我尝试过使用numpy.all函数,但我知道它需要两个相同的数组,并且我需要有一些公差,因为浮点值可能会略有不同。

如何实现这一点?

整数数组
使用
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])

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


浮点数组
对于浮动,您需要在一个公差范围内进行比较,因此用调用
np.allclose
替换
np.array_equal

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


使用
np.allclose
np.isnan

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

这将正确处理
+/-inf
,并允许细微差异。绝对和相对公差可以指定为
allclose

的参数,通过形状检查,您到底想达到什么目的?@PaulPanzer看看疲劳会让您做什么。。不幸的是,现在它有点太像你的答案了,所以如果你对它不舒服,请随意从我的答案中编辑出来。干杯也通过了你的一票。
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])
)
mask = ~(np.isnan(a) | np.isnan(b))
np.allclose(a[mask], b[mask])