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?


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().


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

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.


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

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.


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

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

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

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)

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)))

-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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.