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?

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

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).


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.