Como verificar se duas matrizes são iguais, mesmo que contenham valores de NaN em Julia?

8

Estou tentando comparar duas matrizes. Acontece que os dados para as matrizes contêm NaNvalores e, quando você compara matrizes com NaNvalores, os resultados não são o que eu esperava.

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

Existe uma maneira elegante de ignorá-los Nandurante a comparação ou substituí-los com eficiência?

logankilpatrick
fonte

Respostas:

12

Use isequal:

Semelhante a ==, exceto no tratamento de números de ponto flutuante e de valores ausentes. isequaltrata todos os NaNvalores de ponto flutuante como iguais entre si, trata -0.0como desigual 0.0e missingigual a missing. Sempre retorna um Boolvalor.

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
Giordano
fonte
oh, vejo que esta será a solução mais rápida e ideal!
Gwang-Jin Kim
2

Você provavelmente deseja usar isequal(a, b)(que também trata missingigual a missing, mas -0.0desigual 0.0).

Kristoffer Carlsson
fonte
1
"trata -0,0 como desigual a 0,0" de acordo com os documentos
mschauer
1

Você pode filtrar os NaNs em cada matriz:

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)

Você pode criar uma função que faça a filtragem e uma função de comparação personalizada que use a função de filtragem nos argumentos e na comparação. Não tenho certeza se existe uma maneira mais Julia-esque.

Luan Nico
fonte
1

Ou crie um novo tipo. E crie um Singleton nanque você usa em vez de NaN.

struct MyNaN end
nan = MyNaN()

e escreva uma função para substituir NaNs por ela.

with_nan(l) = map((x) -> if isnan(x) nan else x end, l)

Em seguida, você pode agrupar suas listas usando esta função.

a = [1, 2, NaN]
b = [1, 2, NaN]
with_nan(a) == with_nan(b)
## true
Gwang-Jin Kim
fonte