Среднее значение неоднозначно - мода и медиана также являются часто используемыми средними значениями
jtlz2
Мода и медиана являются другими мерами центральной тенденции. Они не средние. Режим является наиболее распространенным значением в наборе данных и не обязательно уникален. Медиана - это значение, представляющее центр точек данных. Поскольку вопрос подразумевает, есть несколько различных типов средних, но все они отличаются от вычислений медианы и режима. purplemath.com/modules/meanmode.htm
Джаром
@Jarom Эта ссылка не согласна с вами: «Среднее значение, медиана и мода - это три типа« средних »»
Марсело Кантос,
Ответы:
285
Я ничего не знаю в стандартной библиотеке. Тем не менее, вы можете использовать что-то вроде:
NumPy это кошмар, чтобы установить в virtualenv. Вы действительно должны подумать о том, чтобы не использовать эту
библиотеку
46
@vcarel: «Numpy - это кошмар для установки в virtualenv». Я не уверен, почему ты так говоришь. Раньше так и было, но за последний или более год это было очень легко.
6
Я должен второй этот комментарий. В настоящее время я использую Numpy в virtualenv в OSX, и нет абсолютно никаких проблем (в настоящее время использую CPython 3.5).
Хуан Карлос Кото
4
В системах непрерывной интеграции, таких как Travis CI, установка numpy занимает несколько дополнительных минут. Если быстрая и легкая сборка была вам полезна, и вам нужно только среднее, подумайте.
Обратите внимание, что это очень медленно по сравнению с другими решениями. Сравните 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()будут подавлены всеми решениями, которые используют для делителя.
тогда среднее ([2,3]) даст 2. быть осторожным с поплавками. Лучше использовать float (sum (l)) / len (l). Еще лучше, будьте осторожны, чтобы проверить, если список пуст.
Иисус
14
@jesusiniesta за исключением python3, где деление делает то, что оно должно делать: делить
Yota
11
И в Python 2.2+, если вы from __future__ import divisionна вершине своей программы
spiffytech
Как насчет больших чисел и переполнения?
обайхан
Как насчет a = list()? Предлагаемый код приводит к ZeroDivisionError.
Вместо того, чтобы бросать на плавание, вы можете сделать следующее
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.
Правильный ответ на ваш вопрос заключается в использовании 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)))
Другие уже опубликовали очень хорошие ответы, но некоторые люди все еще могут искать классический способ найти 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
Ответы:
Я ничего не знаю в стандартной библиотеке. Тем не менее, вы можете использовать что-то вроде:
В NumPy есть
numpy.mean()
.источник
[]
есть0
, что может быть сделаноfloat(sum(l))/max(len(l),1)
.l
это неверное имя переменной, потому что оно очень похоже1
. Кроме того, я бы использовал,if l
а неif len(l) > 0
. Смотрите здесьmax
?NumPy имеет
numpy.mean
среднее арифметическое. Использование так просто, как это:источник
Используйте
statistics.mean
:Он доступен с Python 3.4. Для пользователей 3.1-3.3 старая версия модуля доступна в PyPI под именем
stats
. Просто измениstatistics
наstats
.источник
timeit("numpy.mean(vec))
,timeit("sum(vec)/len(vec)")
иtimeit("statistics.mean(vec)")
- последний медленнее других по огромному фактору (> 100 в некоторых случаях на моем ПК). По-видимому, это связано с особенно точной реализациейsum
оператораstatistics
, см. PEP и Code . Не уверен насчет причины большой разницы в производительности междуstatistics._sum
иnumpy.sum
, тем не менее.statistics.mean
пытается быть правильным . Он правильно рассчитывает среднее значение[1e50, 1, -1e50] * 1000
.statistics.mean
также примет выражение значений генератора, котороеlen()
будут подавлены всеми решениями, которые используют для делителя.Тебе даже не нужен няшный или скупой ...
источник
from __future__ import division
на вершине своей программыa = list()
? Предлагаемый код приводит кZeroDivisionError
.Используйте scipy:
источник
Вместо того, чтобы бросать на плавание, вы можете сделать следующее
или используя лямбду
ОБНОВЛЕНИЯ: 2019-12-15
Python 3.8 добавил функцию fmean в модуль статистики . Который быстрее и всегда возвращает float.
источник
например
и результат
источник
Примеры:
источник
источник
Я всегда предполагал,
avg
что опущен в buildins / stdlib, потому что это так просто, каки любые предупреждения будут адресованы в коде вызывающего абонента для локального использования .
Известные предостережения:
результат не с плавающей запятой: в python2 9/4 - это 2. для разрешения, использования
float(sum(L))/len(L)
илиfrom __future__ import division
деление на ноль: список может быть пустым. Решить:
источник
Правильный ответ на ваш вопрос заключается в использовании
statistics.mean
. Но для удовольствия, вот версия означает, что не используетlen()
функцию, поэтому она (какstatistics.mean
) может использоваться на генераторах, которые не поддерживаютlen()
:источник
Другие уже опубликовали очень хорошие ответы, но некоторые люди все еще могут искать классический способ найти Mean (avg), поэтому здесь я выкладываю это (код, протестированный в Python 3.6):
источник