Wie kann man überprüfen, ob zwei Arrays gleich sind, auch wenn sie in Julia NaN-Werte enthalten?

8

Ich versuche zwei Arrays zu vergleichen. Es kommt einfach so vor, dass die Daten für die Arrays NaNWerte enthalten und wenn Sie Arrays mit NaNWerten vergleichen , sind die Ergebnisse nicht das, was ich erwartet hätte.

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

Gibt es eine elegante Möglichkeit, diese Nanbeim Vergleich zu ignorieren oder effizient zu ersetzen?

logankilpatrick
quelle

Antworten:

12

Verwendung isequal:

Ähnlich wie ==, außer bei der Behandlung von Gleitkommazahlen und fehlenden Werten. isequalbehandelt alle Gleitkommawerte NaNals gleich, behandelt -0.0als ungleich 0.0und missinggleich missing. Gibt immer einen BoolWert zurück.

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
quelle
Oh, ich sehe, das wird die schnellste und optimale Lösung sein!
Gwang-Jin Kim
2

Sie möchten wahrscheinlich verwenden isequal(a, b)(was auch missinggleich missing, aber -0.0ungleich behandelt 0.0).

Kristoffer Carlsson
quelle
1
"behandelt -0,0 als ungleich 0,0" laut docs
mschauer
1

Sie können die NaNs in jedem Array herausfiltern:

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)

Sie können dann eine Funktion erstellen, die die Filterung ausführt, und eine benutzerdefinierte Vergleichsfunktion, die die Filterfunktion für beide Argumente und den Vergleich verwendet. Ich bin mir nicht sicher, ob es einen Julia-ähnlichen Weg gibt.

Luan Nico
quelle
1

Oder erstellen Sie einen neuen Typ. Und erstellen Sie einen Singleton, nanden Sie anstelle von NaN verwenden.

struct MyNaN end
nan = MyNaN()

und schreibe eine Funktion zum Ersetzen von NaNs durch sie.

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

Dann können Sie Ihre Listen mit dieser Funktion umbrechen.

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