NumPy nanmean, nansum и isnan: среднее без пропусков

np.nanmean считает среднее только по значениям, которые не равны NaN. np.nansum суммирует заполненные значения, а np.isnan помогает посчитать пропуски и построить маску.

Какой знаменатель нужен для среднего

Для [4, NaN, 8] среднее равно 6: сумму 12 нужно делить на два заполненных значения, а не на общий размер массива 3. Обычное mean не пропускает NaN и вернёт NaN. Сравнение a == np.nan не подходит для обнаружения пропусков.

Если все значения отсутствуют, nanmean возвращает NaN с предупреждением, а деление суммы на количество заполненных элементов требует отдельной обработки нулевого знаменателя. В упражнении ниже гарантируется хотя бы одно заполненное значение.

Пример на других данных

import numpy as np
a = np.array([4., np.nan, 8.])
missing = np.isnan(a)
print(int(missing.sum()), int((~missing).sum()))
print(float(np.nansum(a)), float(np.nanmean(a)))

Результат:

1 2
12.0 6.0

Попробуйте сами

Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.

Подсчёт NaN, не-NaN и проверка: nansum / count == nanmean

Что уже дано

Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая:

  1. Читает из stdin одну строку с токенами через пробел. Токен nan (строчными) означает пропуск, остальные — вещественные числа. Создаёт одномерный массив arr через np.array(..., dtype=float).
  2. Вычисляет и выводит число NaN-элементов: np.sum(np.isnan(arr)) — целое число.
  3. Вычисляет и выводит число не-NaN-элементов: np.sum(~np.isnan(arr)) — целое число.
  4. Вычисляет s = np.nansum(arr) и m = np.nanmean(arr). Выводит оба значения, округлённые до 4 знаков, через пробел.
  5. Проверяет, совпадает ли round(s / np.sum(~np.isnan(arr)), 4) с round(m, 4). Выводит True или False.

Гарантируется, что в массиве есть хотя бы одно не-NaN значение.

Ввод и вывод

Программа читает stdin и пишет в stdout.

Формат ввода

токен_0 токен_1 ... токен_n

Токен nan (строчными буквами) — пропуск. Остальные токены — вещественные числа. Гарантируется хотя бы одно не-NaN значение.

Формат вывода

Ровно четыре строки:

<число NaN>
<число не-NaN>
<nansum> <nanmean>
<True или False>

Пример

Ввод
5.0 nan 12.0 8.0 nan 3.0 nan 9.0
Вывод
3
5
37.0 7.4
True
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи