¿Cómo verificar si dos matrices son iguales incluso si contienen valores de NaN en Julia?

8

Estoy tratando de comparar dos matrices. Sucede que los datos de las matrices contienen NaNvalores y cuando se comparan matrices con NaNvalores, los resultados no son lo que esperaba.

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

¿Hay alguna forma elegante de ignorar estos Nandurante la comparación o reemplazarlos de manera eficiente?

logankilpatrick
fuente

Respuestas:

12

Uso isequal:

Similar a ==, excepto para el tratamiento de números de coma flotante y de valores faltantes. isequaltrata todos los NaNvalores de coma flotante como iguales entre sí, los trata -0.0como desiguales 0.0y missingcomo iguales a missing. Siempre devuelve un 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
fuente
¡Oh, veo que esta será la solución más rápida y óptima!
Gwang-Jin Kim
2

Probablemente quiera usar isequal(a, b)(que también trata missingigual a missing, pero -0.0igual de desigual 0.0).

Kristoffer Carlsson
fuente
1
"trata -0.0 como desigual a 0.0" según los documentos
mschauer
1

Puede filtrar los NaN en 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)

Luego puede crear una función que realice el filtrado y una función de comparación personalizada que utilice la función de filtrado en ambos argumentos y comparación. No estoy seguro si hay una manera más al estilo de Julia.

Luan Nico
fuente
1

O crea un nuevo tipo. Y cree un Singleton nanque use en lugar de NaN.

struct MyNaN end
nan = MyNaN()

y escribe una función para reemplazar NaNs por él.

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

Luego puede ajustar sus listas con esta función.

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