JuliaにNaN値が含まれている場合でも、2つの配列が等しいかどうかを確認するにはどうすればよいですか?


8

2つの配列を比較しようとしています。たまたま、配列のデータに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比較中にこれらを無視する、または効率的に置き換えるためのエレガントな方法はありますか?

回答:


12

使用isequal

に似ていますが==、浮動小数点数と欠損値の扱いが異なります。isequalすべての浮動小数点NaN値を互いに等しいものとして扱い、と-0.0等しくない0.0、およびmissingと等しいものとして扱いmissingます。常に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

ああ、これが最速かつ最適なソリューションになると思います!
Gwang-Jin Kim

2

おそらく使用する必要がありますisequal(a, b)(これもmissingと同等に扱いますmissingが、-0.0とは異なります0.0)。


1
ドキュメントによれば「-0.0は0.0と等しくないものとして扱われる」
mschauer

1

各配列の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)

次に、フィルタリングを行う関数と、引数と比較の両方でフィルタリング関数を使用するカスタム比較関数を作成できます。よりジュリア風の方法があるかどうかはわかりません。


1

または、新しいタイプを作成します。そしてnan、NaNの代わりに使用するシングルトンを作成します。

struct MyNaN end
nan = MyNaN()

NaNsをそれに置き換える関数を記述します。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.