如何检查两个数组是否相等,即使它们在Julia中包含NaN值?

如何检查两个数组是否相等,即使它们在Julia中包含NaN值?,julia,Julia,我试图比较两个数组。恰好数组的数据包含NaN值,当您将数组与NaN值进行比较时,结果不是我所期望的 julia> a = [1,2, NaN] 3-element Array{Float64,1}: 1.0 2.0 NaN julia> b = [1,2, NaN] 3-element Array{Float64,1}: 1.0 2.0 NaN julia> a == b false 有没有一种优雅的方法可以在比较过程中忽略这些Nan,

我试图比较两个数组。恰好数组的数据包含
NaN
值,当您将数组与
NaN
值进行比较时,结果不是我所期望的

julia> a = [1,2, NaN]
3-element Array{Float64,1}:
   1.0
   2.0
 NaN  

julia> b = [1,2, NaN]
3-element Array{Float64,1}:
   1.0
   2.0
 NaN  

julia> a == b
false

有没有一种优雅的方法可以在比较过程中忽略这些
Nan
,或者有效地替换它们

您可以过滤掉每个阵列上的NaN:

a = [1, 2, NaN]
filteredA = filter(x -> !isnan(x), a)

b = [1, 2, NaN]
filteredB = filter(x -> !isnan(x), b)

print(a == b)
print(filteredA == filteredB)

然后,您可以创建一个执行过滤的函数,以及一个自定义比较函数,该函数在参数和比较上都使用过滤函数。不确定是否有更类似朱莉娅的方法。

您可能希望使用
等质量(a,b)
(这也将
缺失的
视为等同于
缺失的
,但
-0.0
不等同于
0.0
)。

或创建一个新类型。并创建一个Singleton
nan
,用它代替nan

struct MyNaN end
nan = MyNaN()
并编写一个函数,用它替换
NaN
s

with_nan(l) = map((x) -> if isnan(x) nan else x end, l)
然后可以使用此函数包装列表

a = [1, 2, NaN]
b = [1, 2, NaN]
with_nan(a) == with_nan(b)
## true
使用:

类似于
==
,除了浮点数和 缺少值的情况
isequal
将所有浮点
NaN
值视为 彼此相等,将
-0.0
视为不等于
0.0
,并将
缺失
视为 等于
缺失
。始终返回一个
Bool


哦,我看到这将是最快和最佳的解决方案!
julia> a = [1,2, NaN]
3-element Array{Float64,1}:
   1.0
   2.0
 NaN  

julia> b = [1,2, NaN]
3-element Array{Float64,1}:
   1.0
   2.0
 NaN  

julia> isequal(a, b)
true