Menghitung rata-rata aritmatika (satu jenis rata-rata) dalam Python

268

Apakah ada metode perpustakaan bawaan atau standar dalam Python untuk menghitung rata-rata aritmatika (satu jenis rata-rata) dari daftar angka?

jrdioko
sumber
Rata-rata bersifat ambigu - mode dan median juga merupakan rata-rata yang umum digunakan
jtlz2
Mode dan median adalah ukuran lain dari kecenderungan sentral. Mereka bukan rata-rata. Mode adalah nilai paling umum yang terlihat dalam kumpulan data dan tidak harus unik. Median adalah nilai yang mewakili pusat dari titik data. Seperti yang tersirat dalam pertanyaan, ada beberapa jenis rata-rata yang berbeda, tetapi semuanya berbeda dari median dan perhitungan mode. purplemath.com/modules/meanmode.htm
Jarom
@Jarom Tautan itu tidak setuju dengan Anda: 'Rata-rata, median, dan mode adalah tiga jenis "rata-rata"'
Marcelo Cantos

Jawaban:

285

Saya tidak mengetahui apa pun di perpustakaan standar. Namun, Anda dapat menggunakan sesuatu seperti:

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

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

Dalam numpy, disana numpy.mean().

NPE
sumber
20
Suatu hal yang umum adalah untuk mempertimbangkan bahwa rata-rata []adalah 0, yang dapat dilakukan oleh float(sum(l))/max(len(l),1).
yo '
8
PEP 8 mengatakan itu ladalah nama variabel yang buruk karena sangat mirip 1. Juga, saya akan menggunakan if ldaripada if len(l) > 0. Lihat di sini
zondo
1
Kenapa kamu menelpon max?
1 -_-
3
Lihat pertanyaan di atas: Untuk menghindari pembagian dengan nol (untuk [])
Simon Fakir
5
Daftar kosong tidak ada artinya. Tolong jangan pura-pura melakukannya.
Marcelo Cantos
193

NumPy memiliki numpy.meanyang merupakan rata-rata aritmatika. Penggunaannya sesederhana ini:

>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335
Bengt
sumber
6
numpy adalah mimpi buruk untuk dipasang di virtualenv. Anda harus benar - benar mempertimbangkan untuk tidak menggunakan lib
vcarel ini
46
@vcarel: "numpy adalah mimpi buruk untuk dipasang di virtualenv". Saya tidak yakin mengapa Anda mengatakan ini. Dulu memang demikian, tetapi selama setahun terakhir atau lebih ini sangat mudah.
6
Saya harus komentar kedua ini. Saat ini saya menggunakan numpy di virtualenv di OSX, dan sama sekali tidak ada masalah (saat ini menggunakan CPython 3.5).
Juan Carlos Coto
4
Dengan sistem integrasi berkesinambungan seperti Travis CI, menginstal numpy membutuhkan beberapa menit ekstra. Jika pembuatan cepat dan ringan bermanfaat bagi Anda, dan Anda hanya perlu yang jahat, pertimbangkan.
Akseli Palén
2
@ AkseliPalén lingkungan virtual di Travis CI dapat menggunakan numpy yang diinstal melalui apt-get menggunakan paket situs sistem . Ini mungkin cukup cepat untuk digunakan bahkan jika seseorang hanya membutuhkan rata-rata.
Bengt
184

Gunakan statistics.mean:

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

Ini tersedia sejak Python 3.4. Untuk pengguna 3.1-3.3, modul versi lama tersedia di PyPI dengan nama stats. Ubah saja statisticske stats.

kirbyfan64sos
sumber
2
Perhatikan bahwa ini sangat lambat jika dibandingkan dengan solusi lain. Bandingkan timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")dan timeit("statistics.mean(vec)")- yang terakhir lebih lambat dari yang lain oleh faktor yang sangat besar (> 100 dalam beberapa kasus di PC saya). Hal ini tampaknya disebabkan oleh implementasi sumoperator yang sangat tepat dalam statistics, lihat PEP dan Kode . Namun, tidak yakin tentang alasan perbedaan kinerja yang besar antara statistics._sumdan numpy.sum.
jhin
10
@ jhin ini karena statistics.meanmencoba menjadi benar . Ini menghitung dengan benar rata-rata [1e50, 1, -1e50] * 1000.
Antti Haapala
1
statistics.meanjuga akan menerima ekspresi nilai generator, yang semua solusi yang digunakan len()untuk pembagi akan tersedak.
PaulMcG
54

Anda bahkan tidak perlu numpy atau scipy ...

>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
Mumon
sumber
24
maka mean ([2,3]) akan memberi 2. hati-hati dengan mengapung. Lebih baik gunakan float (jumlah (l)) / len (l). Lebih baik lagi, berhati-hatilah untuk memeriksa apakah daftar itu kosong.
jesusiniesta
14
@jesusiniesta kecuali dalam python3, di mana divisi melakukan apa yang seharusnya dilakukan: divide
yota
11
Dan dengan Python 2.2+ jika Anda from __future__ import divisionberada di puncak program Anda
spiffytech
Bagaimana dengan angka besar dan melimpah?
obayhan
Bagaimana dengan a = list()? Kode yang diajukan menghasilkan ZeroDivisionError.
Ioannis Filippidis
7

Alih-alih casting ke float Anda bisa melakukan follow

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

atau menggunakan lambda

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

PEMBARUAN: 2019-12-15

Python 3.8 menambahkan fungsi fmean ke modul statistik . Yang lebih cepat dan selalu mengembalikan float.

Konversikan data menjadi float dan hitung rata-rata aritmatika.

Ini berjalan lebih cepat dari fungsi mean () dan selalu mengembalikan float. Data dapat berupa urutan atau dapat diubah. Jika dataset input kosong, naikkan StatisticsError.

fmean ([3.5, 4.0, 5.25])

4.25

Baru dalam versi 3.8.

Vlad Bezden
sumber
2
from statistics import mean
avarage=mean(your_list)

sebagai contoh

from statistics import mean

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

dan hasilnya

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

Contoh:

l1 = [3,5,14,2,5,36,4,3]
l2 = [0,0,0]

print(avg(l1)) # 9.0
print(avg(l2)) # 0.0
jasonleonhard
sumber
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)
Muhoza Yves
sumber
0

Saya selalu mengira avgdihilangkan dari builtins / stdlib karena sesederhana itu

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

dan setiap peringatan akan dialamatkan dalam kode penelepon untuk penggunaan lokal .

Peringatan penting:

  1. hasil non-float: di python2, 9/4 adalah 2. untuk menyelesaikan, menggunakan float(sum(L))/len(L)ataufrom __future__ import division

  2. pembagian dengan nol: daftar mungkin kosong. untuk menyelesaikan:

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

Jawaban yang tepat untuk pertanyaan Anda adalah menggunakan statistics.mean. Tapi untuk bersenang-senang, ini adalah versi rata-rata yang tidak menggunakan len()fungsi, sehingga (seperti statistics.mean) dapat digunakan pada generator, yang tidak mendukung 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)))
PaulMcG
sumber
-2

Yang lain sudah memposting jawaban yang sangat bagus, tetapi beberapa orang mungkin masih mencari cara klasik untuk menemukan Mean (rata-rata), jadi di sini saya memposting ini (kode diuji dengan 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
Hashmatullah Noorzai
sumber