Расчет среднего арифметического (один тип среднего) в Python


268

Есть ли в Python встроенный или стандартный библиотечный метод для вычисления среднего арифметического (одного типа среднего) списка чисел?


Среднее значение неоднозначно - мода и медиана также являются часто используемыми средними значениями
jtlz2

Мода и медиана являются другими мерами центральной тенденции. Они не средние. Режим является наиболее распространенным значением в наборе данных и не обязательно уникален. Медиана - это значение, представляющее центр точек данных. Поскольку вопрос подразумевает, есть несколько различных типов средних, но все они отличаются от вычислений медианы и режима. purplemath.com/modules/meanmode.htm
Джаром

@Jarom Эта ссылка не согласна с вами: «Среднее значение, медиана и мода - это три типа« средних »»
Марсело Кантос,

Ответы:


285

Я ничего не знаю в стандартной библиотеке. Тем не менее, вы можете использовать что-то вроде:

def mean(numbers):
    return float(sum(numbers)) / max(len(numbers), 1)

>>> mean([1,2,3,4])
2.5
>>> mean([])
0.0

В NumPy есть numpy.mean().


20
Общепринято считать, что в среднем []есть 0, что может быть сделано float(sum(l))/max(len(l),1).
лет

8
PEP 8 говорит, что lэто неверное имя переменной, потому что оно очень похоже 1. Кроме того, я бы использовал, if lа не if len(l) > 0. Смотрите здесь
zondo

1
Почему ты звонил max?
1

3
См. Вопрос выше: чтобы избежать деления на ноль (для [])
Симон Факир

5
Пустые списки не имеют значения. Пожалуйста, не притворяйся, что они делают.
Марсело Кантос,

193

NumPy имеет numpy.meanсреднее арифметическое. Использование так просто, как это:

>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335

6
NumPy это кошмар, чтобы установить в virtualenv. Вы действительно должны подумать о том, чтобы не использовать эту
библиотеку

46
@vcarel: «Numpy - это кошмар для установки в virtualenv». Я не уверен, почему ты так говоришь. Раньше так и было, но за последний или более год это было очень легко.

6
Я должен второй этот комментарий. В настоящее время я использую Numpy в virtualenv в OSX, и нет абсолютно никаких проблем (в настоящее время использую CPython 3.5).
Хуан Карлос Кото

4
В системах непрерывной интеграции, таких как Travis CI, установка numpy занимает несколько дополнительных минут. Если быстрая и легкая сборка была вам полезна, и вам нужно только среднее, подумайте.
Аксели Пален

2
@ В виртуальных средах AkseliPalén на Travis CI можно использовать numpy, установленный через apt-get с использованием пакетов системного сайта . Это может быть достаточно быстро, чтобы использовать, даже если нужно только среднее.
Бенгт

184

Используйте statistics.mean:

import statistics
print(statistics.mean([1,2,4])) # 2.3333333333333335

Он доступен с Python 3.4. Для пользователей 3.1-3.3 старая версия модуля доступна в PyPI под именем stats. Просто измени statisticsна stats.


2
Обратите внимание, что это очень медленно по сравнению с другими решениями. Сравните timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")и timeit("statistics.mean(vec)")- последний медленнее других по огромному фактору (> 100 в некоторых случаях на моем ПК). По-видимому, это связано с особенно точной реализацией sumоператора statistics, см. PEP и Code . Не уверен насчет причины большой разницы в производительности между statistics._sumи numpy.sum, тем не менее.
Джин

10
@ jhin это потому, что statistics.meanпытается быть правильным . Он правильно рассчитывает среднее значение [1e50, 1, -1e50] * 1000.
Антти Хаапала

1
statistics.meanтакже примет выражение значений генератора, которое len()будут подавлены всеми решениями, которые используют для делителя.
PaulMcG

54

Тебе даже не нужен няшный или скупой ...

>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3

24
тогда среднее ([2,3]) даст 2. быть осторожным с поплавками. Лучше использовать float (sum (l)) / len (l). Еще лучше, будьте осторожны, чтобы проверить, если список пуст.
Иисус

14
@jesusiniesta за исключением python3, где деление делает то, что оно должно делать: делить
Yota

11
И в Python 2.2+, если вы from __future__ import divisionна вершине своей программы
spiffytech

Как насчет больших чисел и переполнения?
обайхан

Как насчет a = list()? Предлагаемый код приводит к ZeroDivisionError.
Иоаннис Филиппидис


7

Вместо того, чтобы бросать на плавание, вы можете сделать следующее

def mean(nums):
    return sum(nums, 0.0) / len(nums)

или используя лямбду

mean = lambda nums: sum(nums, 0.0) / len(nums)

ОБНОВЛЕНИЯ: 2019-12-15

Python 3.8 добавил функцию fmean в модуль статистики . Который быстрее и всегда возвращает float.

Преобразовать данные в числа с плавающей запятой и вычислить среднее арифметическое.

Это выполняется быстрее, чем функция mean (), и всегда возвращает число с плавающей запятой. Данные могут быть последовательными или повторяемыми. Если входной набор данных пуст, возникает ошибка StatisticsError.

fmean ([3,5, 4,0, 5,25])

4,25

Новое в версии 3.8.



1
def avg(l):
    """uses floating-point division."""
    return sum(l) / float(len(l))

Примеры:

l1 = [3,5,14,2,5,36,4,3]
l2 = [0,0,0]

print(avg(l1)) # 9.0
print(avg(l2)) # 0.0


0

Я всегда предполагал, avgчто опущен в buildins / stdlib, потому что это так просто, как

sum(L)/len(L) # L is some list

и любые предупреждения будут адресованы в коде вызывающего абонента для локального использования .

Известные предостережения:

  1. результат не с плавающей запятой: в python2 9/4 - это 2. для разрешения, использования float(sum(L))/len(L)илиfrom __future__ import division

  2. деление на ноль: список может быть пустым. Решить:

    if not L:
        raise WhateverYouWantError("foo")
    avg = float(sum(L))/len(L)

0

Правильный ответ на ваш вопрос заключается в использовании statistics.mean. Но для удовольствия, вот версия означает, что не использует len()функцию, поэтому она (как statistics.mean) может использоваться на генераторах, которые не поддерживают len():

from functools import reduce
from operator import truediv
def ave(seq):
    return truediv(*reduce(lambda a, b: (a[0] + b[1], b[0]), 
                           enumerate(seq, start=1), 
                           (0, 0)))

-2

Другие уже опубликовали очень хорошие ответы, но некоторые люди все еще могут искать классический способ найти Mean (avg), поэтому здесь я выкладываю это (код, протестированный в Python 3.6):

def meanmanual(listt):

mean = 0
lsum = 0
lenoflist = len(listt)

for i in listt:
    lsum += i

mean = lsum / lenoflist
return float(mean)

a = [1, 2, 3, 4, 5, 6]
meanmanual(a)

Answer: 3.5
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.