NaN-Aware Functions (nanmean, nansum)
NaN-aware functions like np.nanmean and np.nansum compute the usual statistics while quietly skipping missing values, so a single NaN no longer poisons your result.
Learn NaN-Aware Functions (nanmean, nansum) in our free NumPy course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a…
Part of the free Numpy course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
You'll see how an ordinary reduction collapses to NaN, swap in the nan* family, detect missing values with np.isnan , and run NaN-aware reductions along an axis.
A NaN ("not a number") infects any arithmetic it touches, so a plain mean() or sum() over data with even one NaN returns nan . The nan* family — np.nanmean , np.nansum , and friends — ignores the NaNs and computes the statistic over the valid values only.
The whole reduction toolbox has a NaN-aware twin: nanmax , nanmin , nanstd , nanvar , nanmedian , and nanpercentile .
You cannot test for NaN with == because NaN is not equal to anything — not even itself. Use np.isnan(arr) , which returns a boolean mask. Sum the mask to count missing values, or invert it with ~ to keep only the valid ones.
Just like their normal counterparts, the nan* functions accept an axis argument, so you can summarize each row or column while ignoring the NaNs scattered through a 2D array. nanpercentile reads cut points the same way.
One caution: if an entire row or column is NaN, nanmean has nothing to average and returns nan for that slice (with a warning) — a useful signal that the data is fully missing there.
Replace each ___ so the program shows the poisoned mean, then the NaN-aware mean.
Expected output: nan then 22.0 . (Answers: mean , nanmean .)
x == np.nan is always False because NaN is not equal to itself.
✅ Fix: use np.isnan(x) to detect missing values.
A single NaN poisons any normal reduction over the array.
✅ Fix: switch to the NaN-aware twin — np.nanmean , np.nansum , np.nanstd , and so on.
A sensor stream has gaps recorded as NaN. Count the missing readings, then compute the NaN-aware mean, max, min, and standard deviation.
Lesson complete — NaN-aware functions unlocked!
You can now spot a poisoned reduction, reach for np.nanmean and the rest of the nan* family, detect missing values with np.isnan , and run NaN-aware reductions along any axis.
🚀 Up next: Checkpoint — Scientific Computing — combine masking, FFT, histograms, stats, and linalg.
Practice quiz
Why does a normal arr.mean() return nan when arr has one NaN?
- A single NaN poisons the whole reduction
- mean is broken
- It rounds to nan
- NaN counts as zero
Answer: A single NaN poisons the whole reduction. Arithmetic touching NaN yields NaN, so one NaN poisons the result.
For data = [1.0, 2.0, np.nan, 4.0, 5.0], what does np.nanmean(data) return?
- nan
- 3.0
- 12.0
- 2.4
Answer: 3.0. nanmean skips the NaN and averages 1, 2, 4, 5 to get 3.0.
What does np.nansum([1.0, 2.0, np.nan, 4.0, 5.0]) return?
- nan
- 10.0
- 12.0
- 15.0
Answer: 12.0. nansum ignores the NaN and adds 1+2+4+5 = 12.0.
Which function correctly detects NaN values?
- x == np.nan
- x is np.nan
- np.isnan(x)
- x != x only
Answer: np.isnan(x). np.isnan(x) is the reliable element-wise NaN check; == always fails.
Why can't you test for NaN with the == operator?
- == is too slow
- NaN is not equal to anything, not even itself
- == only works on ints
- It raises an error
Answer: NaN is not equal to anything, not even itself. By IEEE rules NaN never equals anything, so x == np.nan is always False.
How do you count NaN values in array a?
- len(a)
- a.count()
- np.isnan(a).sum()
- a.sum()
Answer: np.isnan(a).sum(). np.isnan(a) gives a boolean mask; .sum() counts the True entries.
Which of these is NOT part of the nan-aware family?
- np.nanstd
- np.nanmax
- np.nanmedian
- np.nanconcat
Answer: np.nanconcat. There is no np.nanconcat; nanstd, nanmax, and nanmedian all exist.
What does np.nanmean([[1.0,2.0,np.nan],[4.0,np.nan,6.0]], axis=0) return?
Down each column skipping NaN: [2.5, 2.0, 6.0].
What is np.nanmean essentially equivalent to?
- a.sum()
- a.mean() * 2
- Filling NaN with 0 first
It drops the NaNs, then averages the remaining valid values.
If an entire row is NaN, what does nanmean return for that slice?
- nan (with a warning)
- 0.0
- the row length
- infinity
Answer: nan (with a warning). With nothing to average, nanmean returns nan and warns for that slice.