我需要比较一些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总是只有数字)。我可以想象已经有了一个函数或其他东西,但我就是找不到它。
有什么想法吗?
4条答案
按热度按时间2ledvvac1#
你可以使用掩码数组,当与
np.all
结合使用时,它具有你所要求的行为:或者你可以直接显式地写出你的逻辑,注意numpy必须使用
|
而不是or
,以及由此导致的运算符优先级的差异:piv4azn72#
你可以用
isclose
来检查是否相等(或者是否接近给定的容差--这在比较浮点数时特别有用),用isnan
来检查第二个数组中的NaN。用按位或(|
)将两者结合起来,用all
来要求每一对要么接近要么包含NaN,以获得所需的结果:因此,您可以用途:
clj7thdc3#
关于:
这个函数双向作用(如果第一个列表中有
NaN
,这些也会被忽略)。如果你不想这样(这有点奇怪,因为等式通常是双向作用的),你可以定义:程式码的运作方式如下:我们使用
zip
来输出两个数组的元组,然后检查第一个列表的元素是NaN还是第二个列表的元素,或者它们是相等的。如果你想写一个真正优雅的函数,你最好也执行一个长度检查:
4xrmg8kj4#
numpy.islcose()
现在为这种情况提供了一个参数equal_nan
!文件https://numpy.org/doc/stable/reference/generated/numpy.isclose.html