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. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая:
- Читает из
stdinодну строку с токенами через пробел. Токенnan(строчными) означает пропуск, остальные — вещественные числа. Создаёт одномерный массивarrчерезnp.array(..., dtype=float). - Вычисляет и выводит число NaN-элементов:
np.sum(np.isnan(arr))— целое число. - Вычисляет и выводит число не-NaN-элементов:
np.sum(~np.isnan(arr))— целое число. - Вычисляет
s = np.nansum(arr)иm = np.nanmean(arr). Выводит оба значения, округлённые до 4 знаков, через пробел. - Проверяет, совпадает ли
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
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- np.isnan, np.any и np.all: задача на пропуски в массиве
- dtype NumPy: целые и вещественные массивы, типы элементов
- NumPy shape, ndim, size и dtype: атрибуты массива и задача
- Срезы двумерного массива NumPy: строки, столбцы и шаг
- NumPy reshape и transpose: разница на примере и задача
- NumPy newaxis и squeeze: вектор-строка и вектор-столбец
