Обчислення середнього арифметичного (один тип середнього) в Python


267

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


Середнє значення неоднозначне - середній і середній також часто використовуються середні показники
jtlz2

Режим і медіана - це інші заходи центральної тенденції. Вони не є середніми. Режим є найпоширенішим значенням, що спостерігається в наборі даних, і не обов'язково є унікальним. Медіана - це значення, яке представляє центр точок даних. Як випливає з запитання, існує декілька різних типів середніх значень, але всі вони відрізняються від середніх та модних обчислень. purplemath.com/modules/meanmode.htm
Яром

@Jarom Це посилання з вами не погоджується: "Середня, медіана та режим - це три види" середніх "
Marcelo Cantos

Відповіді:


284

Мені нічого не відомо в стандартній бібліотеці. Однак ви можете використовувати щось на кшталт:

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

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

У нуме, є 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
Дивіться питання вище: Щоб уникнути поділу на нуль (для [])
Simon Fakir

5
Порожні списки не мають значення. Будь ласка, не робіть вигляд, що вони роблять.
Марсело Кантос

193

NumPy має numpy.meanсереднє арифметичне. Використання так само просто:

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

6
numpy - це кошмар, який потрібно встановити у virtualenv. Ви дійсно повинні подумати про те, щоб не скористатися цією lib
vcarel

46
@vcarel: "numpy - це кошмар, який потрібно встановити у virtualenv". Я не впевнений, чому ви це говорите. Це було раніше, але за останній рік і більше це було дуже просто.

6
Я мушу другий цей коментар. Наразі я використовую numpy у virtualenv в OSX, і проблем абсолютно немає (зараз використовую CPython 3.5).
Хуан Карлос Кото

4
У системах безперервної інтеграції, таких як Travis CI, установка numpy займає кілька додаткових хвилин. Якщо швидке і легке складання для вас цінне, і вам потрібна лише середня, врахуйте.
Акселі Пален

2
@ AkseliPalén віртуальні середовища в Travis CI можуть використовувати нумеру, встановлену через 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 та Кодекс . Не впевнений у причині великої різниці у роботі 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). Ще краще, будьте уважні, щоб перевірити, чи список порожній.
jesusiniesta

14
@jesusiniesta, за винятком python3, де дивізіон робить те, що має на меті: ділити
йота

11
А в Python 2.2+, якщо ви from __future__ import divisionна вершині своєї програми
spiffytech

А як щодо великої кількості та переповнення?
obayhan

Про що 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 до модуля статистики . Що швидше і завжди повертається поплавком.

Перетворити дані на плаваючі та обчислити середнє арифметичне.

Це працює швидше, ніж середня () функція, і вона завжди повертає поплавок. Дані можуть бути послідовними або ітерабельними. Якщо вхідний набір даних порожній, виникає статистична помилка.

fmean ([3.5, 4.0, 5.25])

4.25

Нове у версії 3.8.


2
from statistics import mean
avarage=mean(your_list)

наприклад

from statistics import mean

my_list=[5,2,3,2]
avarage=mean(my_list)
print(avarage)

і результат є

3.0

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

1
def list_mean(nums):
    sumof = 0
    num_of = len(nums)
    mean = 0
    for i in nums:
        sumof += i
    mean = sumof / num_of
    return float(mean)

0

Я завжди гадаю, що avgце впущено з вбудованих файлів / stdlib, тому що це так просто

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

і будь-які застереження вже будуть розглянуті в коді абонента для місцевого використання .

Помітні застереження:

  1. non-float результат: у 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

Інші вже опублікували дуже хороші відповіді, але деякі люди все ще можуть шукати класичний спосіб пошуку середнього (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.