Pythonでの算術平均(1種類の平均)の計算


268

数値のリストの算術平均(1種類の平均)を計算する組み込みまたは標準のライブラリメソッドはPythonにありますか?


平均はあいまいです-モードと中央値も一般的に使用される平均です
jtlz2 2018年

モードと中央値は中心的な傾向の他の尺度です。彼らは平均ではありません。モードは、データセットで見られる最も一般的な値であり、必ずしも一意であるとは限りません。中央値は、データポイントの中心を表す値です。質問が意味するように、平均にはいくつかの異なるタイプがありますが、すべて中央値および最頻値の計算とは異なります。 purplemath.com/modules/meanmode.htm
Jarom

@Jaromそのリンクはあなたに同意しません:「平均、中央値、モードは3種類の「平均」です」
Marcelo Cantos

回答:


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 -_- 2017

3
上記の質問を参照してください:ゼロによる除算を回避するには([]の場合)
Simon Fakir

5
空のリストには意味がありません。彼らがそうするふりをしないでください。
Marcelo Cantos

193

NumPyにnumpy.meanは、算術平均であるaがあります。使い方はこれと同じくらい簡単です:

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

6
numpyは、virtualenvにインストールするのが悪夢です。あなたは本当にこのlibを使用しないことを検討すべきです
vcarel

46
@vcarel:「numpyはvirtualenvにインストールするのは悪夢です」。なぜあなたはこれを言うのかわかりません。以前はそうでしたが、昨年以上は非常に簡単でした。

6
私はこのコメントを二番目に言わなければなりません。現在、OSXのvirtualenvでnumpyを使用していますが、まったく問題はありません(現在はCPython 3.5を使用しています)。
ファンカルロスコト

4
Travis CIのような継続的インテグレーションシステムでは、numpyのインストールにさらに数分かかります。迅速かつ軽量なビルドが価値があり、平均値だけが必要な場合は、検討してください。
AkseliPalén16年

2
Travis CIの @AkseliPalén 仮想環境は、システムサイトパッケージを使用してapt-getを介してインストールされたnumpyを使用できます。これは、平均値だけが必要な場合でも使用するのに十分な速さです。
Bengt 2016年

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)")-後者は他の方法よりも非常に遅い(私のPCでは場合によっては> 100)。これは、のsum演算子の特に正確な実装が原因であると思われます。PEPコードをstatistics参照してください。とのパフォーマンスに大きな違いがある理由はわかりません。statistics._sumnumpy.sum
2016年

10
@jhinは、statistics.mean正しくなるようにするためです。の平均を正しく計算し[1e50, 1, -1e50] * 1000ます。
Antti Haapala

1
statistics.meanまた、値のジェネレータ式も受け入れますlen()。除数に使用するすべてのソリューションはこれを抑制します。
PaulMcG 2018

54

numpyやscipyも必要ありません...

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

24
次に、mean([2,3])は2を返します。浮動小数点数に注意してください。float(sum(l))/ len(l)を使用することをお勧めします。さらに良いことに、リストが空かどうかを確認するように注意してください。
jesusiniesta 2013年

14
部門はそれを行うことを目的としているものを行いますのpython3、中を除く@jesusiniesta:デバイド
ヨタ

11
そして、Python 2.2以降from __future__ import divisionでは、プログラムのトップにいる場合
spiffytech

大きな数とオーバーフローはどうですか?
オベイハン

どう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を追加しました。どちらが高速で、常に浮動小数点数を返します。

データを浮動小数点数に変換し、算術平均を計算します。

これは、mean()関数よりも高速に実行され、常にfloatを返します。データはシーケンスまたは反復可能です。入力データセットが空の場合、StatisticsErrorを発生させます。

fmean([3.5、4.0、5.25])

4.25

バージョン3.8の新機能。




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それはと同じくらい簡単なので、私は常にbuiltins / 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.