Python'da aritmetik ortalamanın (bir tür ortalama) hesaplanması


268

Python'da bir sayı listesinin aritmetik ortalamasını (ortalama bir tür) hesaplamak için yerleşik veya standart bir kütüphane yöntemi var mı?


Ortalama belirsiz - mod ve medyan da yaygın olarak kullanılan ortalamalardır
jtlz2

Mod ve medyan merkezi eğilimin diğer ölçütleridir. Bunlar ortalama değildir. Mod, bir veri kümesinde görülen en yaygın değerdir ve mutlaka benzersiz değildir. Medyan, veri noktalarının merkezini temsil eden değerdir. Sorunun da ifade ettiği gibi, birkaç farklı ortalama türü vardır, ancak hepsi medyan ve mod hesaplamalarından farklıdır. purplemath.com/modules/meanmode.htm
Jarom

@Jarom Bu bağlantı sizinle aynı fikirde değil: 'Ortalama, medyan ve mod üç çeşit "ortalamadır"
Marcelo Cantos

Yanıtlar:


285

Standart kütüphanedeki hiçbir şeyin farkında değilim. Ancak, aşağıdaki gibi bir şey kullanabilirsiniz:

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

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

Numpy'de var numpy.mean().


20
Yaygın bir şey ortalama düşünün etmektir []olduğu 0yapılabilir, hangi float(sum(l))/max(len(l),1).
yo '

8
PEP 8 bununl kötü bir değişken adı olduğunu söylüyor çünkü çok benziyor 1. Ayrıca, ben kullanmak if lyerine if len(l) > 0. Buraya
zondo

1
Neden aradın max?
1 -_-

3
Yukarıdaki soruya bakın: Sıfıra bölünmeyi önlemek için ([] için)
Simon Fakir

5
Boş listelerin anlamı yoktur. Lütfen yaptýklarý gibi davranma.
Marcelo Cantos

193

NumPy, numpy.meanaritmetik bir ortalamaya sahiptir. Kullanımı bu kadar basit:

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

6
numpy, bir virtualenv içine kurulacak bir kabus. Gerçekten bu lib kullanmamayı düşünmelisiniz
vcarel

46
@vcarel: "numpy bir sanal ortamda kurulmak için bir kabus". Bunu neden söylediğinden emin değilim. Eskiden durum böyleydi, ancak son bir yıl veya daha uzun bir süredir çok kolay oldu.

6
Bu yorumu ikinci yapmalıyım. Şu anda OSX'te bir sanal ortamda numpy kullanıyorum ve kesinlikle bir sorun yok (şu anda CPython 3.5 kullanıyor).
Juan Carlos Coto

4
Travis CI gibi sürekli entegrasyon sistemleri ile numpy kurulumu birkaç dakika daha sürüyor. Hızlı ve hafif yapı sizin için değerliyse ve sadece ortalamaya ihtiyacınız varsa, düşünün.
Akseli Palén

2
@ Travis CI üzerindeki AkseliPalén sanal ortamları, sistem site paketlerini kullanarak apt-get üzerinden kurulmuş bir numpy kullanabilir . Bu sadece bir ortalamaya ihtiyaç duysa bile kullanmak için yeterince hızlı olabilir.
Bengt

184

Kullanım statistics.mean:

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

Python 3.4'ten beri mevcuttur. 3.1-3.3 kullanıcıları için, modülün eski bir sürümü PyPI'de adıyla bulunur stats. Sadece değiştirmek statisticsiçin stats.


2
Bunun diğer çözümlere kıyasla çok yavaş olduğunu unutmayın. Karşılaştırma timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")ve timeit("statistics.mean(vec)")- ikincisi büyük bir faktör (benim PC'de bazı durumlarda> 100) tarafından diğerlerinden daha yavaştır. Bu, sumoperatörün özellikle hassas bir şekilde uygulanmasından kaynaklanıyor gibi görünüyor statistics, bkz. PEP ve Kod . Bununla birlikte , statistics._sumve arasındaki büyük performans farkının nedeninden emin değilim numpy.sum.
jhin

10
@jhin bu doğrustatistics.mean olmaya çalışır çünkü . Ortalamasını doğru hesaplar . [1e50, 1, -1e50] * 1000
Antti Haapala

1
statistics.meanayrıca len()bölen için kullanılan tüm çözümlerin boşalacağı bir değer üreteci ifadesini kabul edecektir.
PaulMcG

54

Numpy veya scipy'ye bile ihtiyacınız yok ...

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

24
sonra ortalama ([2,3]) yüzerle 2. dikkatli olur. Daha iyi kullanım şamandıra (toplam (l)) / len (l). Daha da iyisi, listenin boş olup olmadığını kontrol etmeye dikkat edin.
jesusiniesta

14
@jesusiniesta, bölünmenin amaçlanan şeyi yaptığı python3 hariç: bölmek
yota

11
Python 2.2+ from __future__ import divisionprogramınızın
başındaysanız

Büyük sayılar ve taşma ne olacak?
obayhan

Ne olmuş a = list()? Önerilen kod ile sonuçlanır ZeroDivisionError.
Ioannis Filippidis


7

Yüzmek için döküm yapmak yerine aşağıdakileri yapabilirsiniz

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

veya lambda kullanarak

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

GÜNCELLEME: 2019-12-15

Python 3.8 fonksiyon eklendi fmean için istatistik modülü. Hangi daha hızlı ve her zaman float döner.

Verileri kayan noktaya dönüştürün ve aritmetik ortalamayı hesaplayın.

Bu, mean () işlevinden daha hızlı çalışır ve her zaman bir kayan nokta döndürür. Veriler bir sekans veya tekrarlanabilir olabilir. Girdi veri kümesi boşsa, bir StatisticsError oluşturur.

fmean ([3.5, 4.0, 5.25])

4.25

3.8 sürümündeki yenilikler.


2
from statistics import mean
avarage=mean(your_list)

Örneğin

from statistics import mean

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

ve sonuç

3.0

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

Örnekler:

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

Her zaman avgyerleşiklerden / stdlib'den çıkarıldım çünkü bu kadar basit

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

ve tüm uyarılar zaten yerel kullanım için arayan kodunda ele alınacaktır .

Önemli uyarılar:

  1. float dışı sonuç: python2'de 9/4 2'dir. çözmek, kullanmak float(sum(L))/len(L)veyafrom __future__ import division

  2. sıfıra bölme: liste boş olabilir. çözmek için:

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

0

Sorunuzun doğru cevabı kullanmaktır statistics.mean. Ancak eğlence için, len()işlevi kullanmayan bir ortalama sürümdür , bu yüzden (gibi statistics.mean) desteklemeyen jeneratörlerde kullanılabilir 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

Diğerleri zaten çok iyi cevaplar gönderdi, ancak bazı insanlar hala Ortalama (avg) bulmak için klasik bir yol arıyor olabilir, bu yüzden burada bunu gönderiyorum (kod Python 3.6'da test edildi):

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.