Làm cách nào để kiểm tra xem hai mảng có bằng nhau ngay cả khi chúng có chứa các giá trị NaN trong Julia không?


8

Tôi đang cố gắng để so sánh hai mảng. Nó chỉ xảy ra rằng dữ liệu cho các mảng chứa NaNcác giá trị và khi bạn so sánh các mảng với NaNcác giá trị, kết quả không như tôi mong đợi.

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

Có một cách thanh lịch để bỏ qua những điều này Nantrong khi so sánh hoặc thay thế chúng một cách hiệu quả?

Câu trả lời:


12

Sử dụng isequal:

Tương tự như ==, ngoại trừ việc xử lý số dấu phẩy động và các giá trị bị thiếu. isequalcoi tất cả các NaNgiá trị dấu phẩy động bằng nhau, coi các giá trị -0.0không bằng nhau 0.0missingbằng nhau missing. Luôn trả về một Boolgiá trị.

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 tôi thấy đây sẽ là giải pháp nhanh nhất và tối ưu!
Gwang-Jin Kim

2

Bạn có thể muốn sử dụng isequal(a, b)(cũng đối xử missingbằng missing, nhưng -0.0là không bằng nhau 0.0).


1
"coi -0.0 là không bằng 0,0" theo các tài liệu
mschauer

1

Bạn có thể lọc ra NaN trên mỗi mảng:

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)

Sau đó, bạn có thể tạo một hàm thực hiện chức năng lọc và chức năng so sánh tùy chỉnh sử dụng chức năng lọc trên cả đối số và so sánh. Không chắc chắn nếu có một cách Julia-esque hơn.


1

Hoặc tạo một loại mới. Và tạo một Singleton nanmà bạn sử dụng thay vì NaN.

struct MyNaN end
nan = MyNaN()

và viết một hàm để thay thế NaNs bởi nó.

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

Sau đó, bạn có thể bọc danh sách của bạn bằng cách sử dụng chức năng này.

a = [1, 2, NaN]
b = [1, 2, NaN]
with_nan(a) == with_nan(b)
## true
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.