# Extrema(x,dims=1) and NaNs

**URL:** <https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764>\
**Category:** General Usage\
**Created:** [December 29, 2021, 4:52pm UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764 "2021-12-29T16:52:16Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![Paul\_Soderlind](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/paul_soderlind/32/1753_2.png) [@Paul\_Soderlind](https://discourse.julialang.org/u/Paul_Soderlind)\
**Post date:** [December 29, 2021, 4:52pm UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/1 "2021-12-29T16:52:16Z")

</div>

It seems `extrema(x,dims=1)` silently drops NaNs - and I cannot find that documented. (As a reference, `minimum` does not.) Did I miss something?

Example

```julia
x = [1,NaN,3]
println(extrema(x))
println(extrema(x,dims=1))

```

gives

```julia
(NaN, NaN)
[(1.0, 3.0)]   

```

---

<div class="post-metadata">

**Author:** ![mikmoore](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mikmoore/32/31109_2.png) [@mikmoore](https://discourse.julialang.org/u/mikmoore)\
**Post date:** [December 30, 2021, 12:28am UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/2 "2021-12-30T00:28:37Z")

</div>

Looks like a bug to me. I went ahead and opened issue [#43599](https://github.com/JuliaLang/julia/issues/43599).

---

<div class="post-metadata">

**Author:** ![ellocco](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ellocco/32/31331_2.png) [@ellocco](https://discourse.julialang.org/u/ellocco)\
**Post date:** [May 30, 2023, 11:14am UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/3 "2023-05-30T11:14:36Z")

</div>

> [@Paul\_Soderlind](#):
>
> ```julia
> x = [1,NaN,3]
> println(extrema(x))
> 
> ```

It seems not yet fixed. Is there an alternative to function `extrema()`?  
It fails also, if the variable contains elements of type `Missing` ☹  
In my case the following helped:

```julia
_z_phase_array = [2.0,2,missing,2,2]
extrema(DataFrames.skipmissing(_z_phase_array))

```

---

<div class="post-metadata">

**Author:** ![fatteneder](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fatteneder/32/33991_2.png) [@fatteneder](https://discourse.julialang.org/u/fatteneder)\
**Post date:** [May 30, 2023, 11:23am UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/4 "2023-05-30T11:23:43Z")

</div>

I works for me on julia `v1.9.0-rc2`:

```julia
julia> x = [1,NaN,3]
3-element Vector{Float64}:
   1.0
 NaN
   3.0

julia> extrema(x)
(NaN, NaN)

julia> extrema(x,dims=1)
1-element Vector{Tuple{Float64, Float64}}:
 (NaN, NaN)

```

---

<div class="post-metadata">

**Author:** ![ellocco](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ellocco/32/31331_2.png) [@ellocco](https://discourse.julialang.org/u/ellocco)\
**Post date:** [May 30, 2023, 11:25am UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/5 "2023-05-30T11:25:24Z")

</div>

I expect, the output (1,3) and not (NaN,NaN).

---

<div class="post-metadata">

**Author:** ![fatteneder](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fatteneder/32/33991_2.png) [@fatteneder](https://discourse.julialang.org/u/fatteneder)\
**Post date:** [May 30, 2023, 11:28am UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/6 "2023-05-30T11:28:04Z")

</div>

Well, the issue #43599 was about to include the `NaN`s when checking for extrema.

If you don’t want that, you need to roll your own function, probably.

---

<div class="post-metadata">

**Author:** ![ellocco](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ellocco/32/31331_2.png) [@ellocco](https://discourse.julialang.org/u/ellocco)\
**Post date:** [May 30, 2023, 11:31am UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/7 "2023-05-30T11:31:22Z")

</div>

Or use the workarounds provided in package [`DataFrames`](https://dataframes.juliadata.org/stable/man/missing/)

---

<div class="post-metadata">

**Author:** ![fatteneder](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fatteneder/32/33991_2.png) [@fatteneder](https://discourse.julialang.org/u/fatteneder)\
**Post date:** [May 30, 2023, 11:34am UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/8 "2023-05-30T11:34:22Z")

</div>

Yes, you could use those too and then call `extrema(..)` on their output.  
But this will probably allocate an additional array (besides the one returned from `extrema`).  
If you want to avoid that too, roll your own version with for loops 🙂

---

<div class="post-metadata">

**Author:** ![aplavin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aplavin/32/222056_2.png) [@aplavin](https://discourse.julialang.org/u/aplavin)\
**Post date:** [May 30, 2023, 11:46am UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/9 "2023-05-30T11:46:44Z")

</div>

Try `Skipper`, a lighweight package to efficiently skip arbitrary elements:

```julia
julia> using Skipper
julia> x = [1,NaN,3]
julia> extrema(skip(isnan, x))
(1.0, 3.0)

```

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [May 30, 2023, 1:28pm UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/10 "2023-05-30T13:28:02Z")

</div>

if you don’t want to depend on packages not in Base

```julia
x = [1,NaN,3]
extrema(filter(!isnan, x))

x = [1,NaN,missing,3]
extrema(filter(e-> (!ismissing(e)) && (!isnan(e)), x))

```

as a side note

```julia

extrema(filter(e-> (!isnan(e)) & (!ismissing(e)), x)) # works
extrema(filter(e-> (!isnan(e)) && (!ismissing(e)), x)) # doesn't work!!! (due to short circuit)

```

if you use lazy filter, it doesn’t even allocate

```julia

julia> @btime extrema(Iterators.filter(e-> (!isnan(e)) & (!ismissing(e)), $x))
  8.300 ns (0 allocations: 0 bytes)
(1.0, 3.0)

julia> @btime extrema(Iterators.filter(e-> (!ismissing(e)) && (!isnan(e)), $x))
  8.500 ns (0 allocations: 0 bytes)
(1.0, 3.0)

julia> @btime extrema(Iterators.filter(e-> (!ismissing(e)) & (!isnan(e)), $x))
  8.300 ns (0 allocations: 0 bytes)
(1.0, 3.0)

```

---

<div class="post-metadata">

**Author:** ![raman\_kumar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raman_kumar/32/26782_2.png) [@raman\_kumar](https://discourse.julialang.org/u/raman_kumar)\
**Post date:** [November 20, 2025, 7:43pm UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/11 "2025-11-20T19:43:27Z")

</div>

This issue still exist in Julia 1.12.1. Is it defined that way?

```julia-auto
julia> x = [1,NaN,3]
3-element Vector{Float64}:
   1.0
 NaN
   3.0

julia> println(extrema(x))
(NaN, NaN)

julia> println(extrema(x,dims=1))
[(NaN, NaN)]

```

---

<div class="post-metadata">

**Author:** ![adienes](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adienes/32/37459_2.png) [@adienes](https://discourse.julialang.org/u/adienes)\
**Post date:** [November 20, 2025, 7:46pm UTC](https://discourse.julialang.org/t/extrema-x-dims-1-and-nans/73764/12 "2025-11-20T19:46:04Z")

</div>

that is the correct and intended behavior.
