如何比较两个带有NaN值的numpy数组?

vmjh9lq9  于 2022-12-13  发布在  其他
关注(0)|答案(4)|浏览(166)

我需要比较一些numpy数组,它们应该具有相同顺序的相同元素,除了第二个数组中的一些NaN值。
我需要一个函数,大致如下:

def func( array1, array2 ):
    if ???:
        return True
    else:
        return False

范例:

x = np.array( [ 1, 2, 3, 4, 5 ] )
y = np.array( [ 11, 2, 3, 4, 5 ] )
z = np.array( [ 1, 2, np.nan, 4, 5] )

func( x, z ) # returns True
func( y, z ) # returns False

数组总是有相同的长度,NaN值总是在第三个数组中(x和y总是只有数字)。我可以想象已经有了一个函数或其他东西,但我就是找不到它。
有什么想法吗?

2ledvvac

2ledvvac1#

你可以使用掩码数组,当与np.all结合使用时,它具有你所要求的行为:

zm = np.ma.masked_where(np.isnan(z), z)

np.all(x == zm) # returns True
np.all(y == zm) # returns False

或者你可以直接显式地写出你的逻辑,注意numpy必须使用|而不是or,以及由此导致的运算符优先级的差异:

def func(a, b):
    return np.all((a == b) | np.isnan(a) | np.isnan(b))
piv4azn7

piv4azn72#

你可以用isclose来检查是否相等(或者是否接近给定的容差--这在比较浮点数时特别有用),用isnan来检查第二个数组中的NaN。用按位或(|)将两者结合起来,用all来要求每一对要么接近要么包含NaN,以获得所需的结果:

In [62]: np.isclose(x,z)
Out[62]: array([ True,  True, False,  True,  True], dtype=bool)

In [63]: np.isnan(z)
Out[63]: array([False, False,  True, False, False], dtype=bool)

因此,您可以用途:

def func(a, b):
    return (np.isclose(a, b) | np.isnan(b)).all()

In [67]: func(x, z)
Out[67]: True

In [68]: func(y, z)
Out[68]: False
clj7thdc

clj7thdc3#

关于:

from math import isnan

def fun(array1,array2):
    return all(isnan(x) or isnan(y) or x == y for x,y in zip(array1,array2))

这个函数双向作用(如果第一个列表中有NaN,这些也会被忽略)。如果你不想这样(这有点奇怪,因为等式通常是双向作用的),你可以定义:

from math import isnan

def fun(array1,array2):
    return all(isnan(y) or x == y for x,y in zip(array1,array2))

程式码的运作方式如下:我们使用zip来输出两个数组的元组,然后检查第一个列表的元素是NaN还是第二个列表的元素,或者它们是相等的。
如果你想写一个真正优雅的函数,你最好也执行一个长度检查:

from math import isnan

def fun(array1,array2):
    return len(array1) == len(array2) and all(isnan(y) or x == y for x,y in zip(array1,array2))
4xrmg8kj

4xrmg8kj4#

numpy.islcose()现在为这种情况提供了一个参数equal_nan

>>> import numpy as np
>>> np.isclose([1.0, np.nan], [1.0, np.nan])
array([ True, False])
>>> np.isclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)
array([ True,  True])

文件https://numpy.org/doc/stable/reference/generated/numpy.isclose.html

相关问题