파이썬에서 산술 평균 (한 유형의 평균) 계산


267

숫자 목록의 산술 평균 (한 유형의 평균)을 계산하기 위해 Python에 내장 또는 표준 라이브러리 방법이 있습니까?


평균은 모호합니다. 모드이며 중앙값도 일반적으로 사용되는 평균입니다.
jtlz2

모드와 중앙값은 중심 경향의 다른 측정 값입니다. 그들은 평균이 아닙니다. 모드는 데이터 세트에서 가장 일반적인 값이며 반드시 고유하지는 않습니다. 중앙값은 데이터 포인트의 중심을 나타내는 값입니다. 질문에서 알 수 있듯이 평균에는 몇 가지 유형의 평균이 있지만 모두 중앙값 및 모드 계산과 다릅니다. purplemath.com/modules/meanmode.htm
이롬

@Jarom 당신과 함께 링크 동의하지 그건 '평균, 중앙값 및 모드는 "평균"세 가지 종류의'
마르셀 칸토

답변:


284

표준 라이브러리에 아무것도 없습니다. 그러나 다음과 같은 것을 사용할 수 있습니다.

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).
yo '

8
PEP 8은 말한다l너무 많은처럼 보이기 때문에 나쁜 변수 이름입니다 1. 또한, if l대신에 사용하겠습니다 if len(l) > 0. 여기를
zondo

1
왜 전화 했어 max?
1 -_-

3
위의 질문을 참조하십시오 : 0으로
나누지

5
빈 목록은 의미가 없습니다. 그들이 척하지 마십시오.
Marcelo Cantos '

193

NumPy는 numpy.mean산술 평균 인 a를가집니다 . 사용법은 다음과 같이 간단합니다.

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

6
numpy는 virtualenv에 설치하는 악몽입니다. 이 라이브러리를 사용하지 않는 것이
좋습니다

46
@vcarel : "numpy는 virtualenv에 설치하는 악몽입니다". 왜 이런 말을하는지 모르겠습니다. 예전의 경우 였지만 작년 이상은 매우 쉬웠습니다.

6
이 의견을 두 번째로해야합니다. 현재 OSX의 virtualenv에서 numpy를 사용하고 있으며 전혀 문제가 없습니다 (현재 CPython 3.5 사용).
Juan Carlos Coto

4
Travis CI와 같은 지속적인 통합 시스템을 사용하면 numpy를 설치하는 데 몇 분이 더 걸립니다. 빠르고 가벼운 구조가 당신에게 가치가 있고, 그저 의미가 필요한 경우 고려하십시오.
Akseli Palén

2
Travis CI의 @ AkseliPalén 가상 환경은 시스템 사이트 패키지를 사용하여 apt-get을 통해 설치된 numpy를 사용할 수 있습니다 . 평균이 필요한 경우에도 사용하기에 충분히 빠를 수 있습니다.
Bengt

184

사용 statistics.mean:

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

파이썬 3.4부터 사용할 수 있습니다. 3.1-3.3 사용자의 경우 PyPI에서 이전 버전의 모듈을 이름 아래에서 사용할 수 있습니다 stats. 로 변경 statistics하십시오 stats.


2
다른 솔루션과 비교할 때 이것은 매우 느립니다. 비교 timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")그리고 timeit("statistics.mean(vec)")- 후자는 큰 요인 (내 PC에 어떤 경우> 100)에 의해 다른 사람보다 느립니다. 이는 특히 sum연산자 의 정확한 구현으로 인한 것으로 statistics보입니다 ( PEP코드 참조) . 큰 성능의 차이에 대한 이유에 대해 확실하지 statistics._sum하고 numpy.sum있지만,.
jhin

10
@ jhin이 statistics.mean시도가 정확 하기 때문 입니다. 의 평균을 정확하게 계산합니다 [1e50, 1, -1e50] * 1000.
Antti Haapala

1
statistics.mean또한 len()제수에 사용되는 모든 솔루션 이 질식 하는 생성기 값 표현을 허용합니다 .
PaulMcG

54

당신은 numpy 또는 scipy가 필요하지 않습니다 ...

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

24
그런 다음 mean ([2,3])은 수레를 조심해야합니다. float (sum (l)) / len (l)을 사용하는 것이 좋습니다. 더 좋은 방법은 목록이 비어 있는지 확인하는 것입니다.
jesusiniesta

14
분할 : 사업부가 수행하는 역할 수행 python3, 제외 @jesusiniesta
YOTA

11
그리고 파이썬 2.2 이상 from __future__ import division에서는 프로그램의 최상위에 있다면
spiffytech

큰 숫자와 오버플로는 어떻습니까?
obayhan

무엇에 대해 a = list()? 제안 된 코드의 결과는 ZeroDivisionError입니다.
Ioannis Filippidis


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 () 함수보다 빠르게 실행되며 항상 float를 반환합니다. 데이터는 시퀀스이거나 반복 가능할 수 있습니다. 입력 데이터 집합이 비어 있으면 StatisticsError가 발생합니다.

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. 비 플로트 결과 : python2에, 9/4는 해결, 사용 2. float(sum(L))/len(L)또는from __future__ import division

  2. 0으로 나누기 : 목록이 비어있을 수 있습니다. 해결하려면 :

    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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.