Среднее число в Python: способы вычисления
Вычисление среднего числа в Python
Среднее арифметическое (mean) - одна из базовых статистических метрик. В Python существует несколько путей его получения, от простого sum() / len() до использования специализированных библиотек. Ниже разобраны основные варианты с пояснениями и типичными проблемами.
Как получить среднее значение с помощью модуля statistics?
Стандартная библиотека Python включает модуль statistics, в котором есть функция mean(). Это рекомендуемый способ для большинства случаев, так как он обрабатывает числа с плавающей точкой корректно и понятен.
import statistics
data = [10, 20, 30, 40, 50]
average = statistics.mean(data)
print(average)
Python среднее число (вычисление среднего числа в python)
30
Abs x python (функция abs() в python)
Функция принимает итерируемый объект с числами. Для пустого списка выбрасывается StatisticsError.
Проблема: передача пустой последовательности вызывает исключение. Решение - предварительная проверка длины.
if data:
print(statistics.mean(data))
else:
print("Список пуст")
Python найти максимальное значение (поиск максимального значения в python)
Как вычислить среднее вручную, без импорта библиотек?
Классический метод - сумма элементов, делённая на их количество. Подходит для простых задач, где не нужна дополнительная обработка.
data = [15, 25, 35]
average = sum(data) / len(data)
print(average)
числа словами python (преобразование чисел в слова в python)
25.0
округление python round (округление чисел в python (round))
Ошибка деления на ноль: если список пуст, len(data) == 0 вызывает ZeroDivisionError. Нужна защита.
if len(data) > 0:
average = sum(data) / len(data)
else:
average = 0
Как использовать NumPy для среднего?
Библиотека numpy предоставляет быструю функцию mean(), особенно эффективную на больших массивах. Она поддерживает многомерные массивы и ось (axis).
import numpy as np
data = [1.5, 2.5, 3.5]
average = np.mean(data)
print(average)
2.5
Для двумерного массива можно вычислить среднее по строкам или столбцам.
Проблема: если данные содержат NaN, результат тоже будет NaN. Решение - np.nanmean(), игнорирующее пропуски.
import numpy as np
data = [1.0, np.nan, 3.0]
print(np.nanmean(data))
2.0
Как посчитать среднее с помощью reduce и lambda?
Функциональный подход с functools.reduce - альтернативный способ, демонстрирующий мощь свёртки. Может быть полезен в учебных целях или в коде, где уже используется функциональный стиль.
from functools import reduce
data = [10, 20, 30]
average = reduce(lambda x, y: x + y, data) / len(data)
print(average)
20.0
Важно: reduce не обрабатывает пустой список, потребуется проверка.
Проблема: reduce на пустой последовательности вызовет TypeError. Рекомендуется использовать с проверкой.
Как быть, если данные - целые числа и нужен целочисленный результат?
Иногда требуется округление или целая часть среднего. В таких случаях можно применить целочисленное деление (//) или округление.
data = [1, 2, 3, 4]
average_int = sum(data) // len(data)
print(average_int)
2
Однако такое отбрасывание дробной части может исказить результат. Лучше использовать round() или math.floor() / math.ceil() после вычисления.
Проблема: целочисленное деление всегда округляет вниз (для положительных чисел). Для отрицательных чисел поведение отличается. Используйте int(round(...)) для стандартного округления.
Выбор метода зависит от контекста: для быстрого прототипа подойдёт statistics.mean(), для работы с большими данными - numpy, для обучения - ручное вычисление. Всегда учитывайте обработку пустых списков и тип данных.
Расширенные примеры вычисления среднего
Среднее с игнорированием пропущенных значений (NaN)
Использование numpy.nanmean для списка с пропусками.
import numpy as np
data = [1.0, np.nan, 3.0, np.nan, 5.0]
average = np.nanmean(data)
print(average)
3.0
Пояснение: функция автоматически исключает NaN из расчёта, количество учитываемых элементов равно числу не-NaN значений.
Взвешенное среднее
Когда элементы имеют разный вес, используется взвешенное среднее: сумма произведений значений на веса, делённая на сумму весов.
values = [70, 80, 90]
weights = [1, 2, 3]
weighted_avg = sum(v * w for v, w in zip(values, weights)) / sum(weights)
print(weighted_avg)
83.33333333333333
Подходит для ситуаций, где важность данных неодинакова (например, оценки по разным предметам).
Скользящее среднее (moving average)
Среднее по окну данных, часто используется для сглаживания временных рядов. Реализация с помощью цикла.
def moving_average(data, window_size):
result = []
for i in range(len(data) - window_size + 1):
window = data[i:i+window_size]
result.append(sum(window) / window_size)
return result
data = [1, 2, 3, 4, 5, 6]
print(moving_average(data, 3))
[2.0, 3.0, 4.0, 5.0]
Первый элемент результата - среднее первых трёх элементов: (1+2+3)/3 = 2.0.
Среднее по каждому столбцу двумерного списка
Использование numpy.mean с параметром axis.
import numpy as np
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(matrix)
col_means = np.mean(arr, axis=0)
row_means = np.mean(arr, axis=1)
print("Средние по столбцам:", col_means)
print("Средние по строкам:", row_means)
Средние по столбцам: [4. 5. 6.] Средние по строкам: [2. 5. 8.]
Пояснение: axis=0 - усреднение по вертикали (вдоль строк), axis=1 - по горизонтали (вдоль столбцов).
Среднее с использованием pandas
Библиотека pandas даёт метод mean() для Series и DataFrame.
import pandas as pd
s = pd.Series([10, 20, 30, 40])
df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]})
print("Среднее Series:", s.mean())
print("Среднее DataFrame по столбцам:\n", df.mean())
Среднее Series: 25.0 Среднее DataFrame по столбцам: A 2.0 B 5.0 dtype: float64
Pandas автоматически исключает NaN по умолчанию (параметр skipna=True).
Среднее гармоническое (harmony mean) из statistics
Для данных, где важен обратный масштаб, например скорости.
import statistics
data = [10, 20, 30]
harmonic_mean = statistics.harmonic_mean(data)
print(harmonic_mean)
16.363636363636363
Формула: n / (1/x1 + 1/x2 + ... + 1/xn). Не допускает нулевых значений.
Среднее с округлением до заданной точности
Использование round() после вычисления.
data = [2.345, 3.678, 1.234]
average = sum(data) / len(data)
rounded = round(average, 2)
print(rounded)
2.42
Округление до двух знаков. Обратите внимание, что round() использует банковское округление (к чётному) в Python 3.
Среднее для списка строковых чисел
Если числа представлены строками, нужно преобразование типов.
string_numbers = ['10.5', '20.3', '30.8']
values = [float(x) for x in string_numbers]
average = sum(values) / len(values)
print(average)
20.533333333333335
Пояснение: генератор списка конвертирует строки в float, затем вычисляется среднее.
Среднее с использованием Decimal для высокой точности
Для финансовых расчётов, где важна точность десятичных дробей.
from decimal import Decimal, getcontext
getcontext().prec = 10
data = [Decimal('0.1'), Decimal('0.2'), Decimal('0.3')]
average = sum(data) / Decimal(len(data))
print(average)
0.2
Decimal избегает ошибок округления, свойственных float.
Среднее в одну строку с помощью map и sum
Краткая запись без явного цикла.
data = [1, 2, 3, 4, 5]
average = sum(data) / len(data) if data else 0
print(average)
3.0
Тернарный оператор гарантирует защиту от пустого списка.