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:
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.
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.
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.
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.
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)))
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
Jawaban:
Saya tidak mengetahui apa pun di perpustakaan standar. Namun, Anda dapat menggunakan sesuatu seperti:
Dalam numpy, disana
numpy.mean()
.sumber
[]
adalah0
, yang dapat dilakukan olehfloat(sum(l))/max(len(l),1)
.l
adalah nama variabel yang buruk karena sangat mirip1
. Juga, saya akan menggunakanif l
daripadaif len(l) > 0
. Lihat di sinimax
?NumPy memiliki
numpy.mean
yang merupakan rata-rata aritmatika. Penggunaannya sesederhana ini:sumber
Gunakan
statistics.mean
:Ini tersedia sejak Python 3.4. Untuk pengguna 3.1-3.3, modul versi lama tersedia di PyPI dengan nama
stats
. Ubah sajastatistics
kestats
.sumber
timeit("numpy.mean(vec))
,timeit("sum(vec)/len(vec)")
dantimeit("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 implementasisum
operator yang sangat tepat dalamstatistics
, lihat PEP dan Kode . Namun, tidak yakin tentang alasan perbedaan kinerja yang besar antarastatistics._sum
dannumpy.sum
.statistics.mean
mencoba menjadi benar . Ini menghitung dengan benar rata-rata[1e50, 1, -1e50] * 1000
.statistics.mean
juga akan menerima ekspresi nilai generator, yang semua solusi yang digunakanlen()
untuk pembagi akan tersedak.Anda bahkan tidak perlu numpy atau scipy ...
sumber
from __future__ import division
berada di puncak program Andaa = list()
? Kode yang diajukan menghasilkanZeroDivisionError
.Gunakan scipy:
sumber
Alih-alih casting ke float Anda bisa melakukan follow
atau menggunakan lambda
PEMBARUAN: 2019-12-15
Python 3.8 menambahkan fungsi fmean ke modul statistik . Yang lebih cepat dan selalu mengembalikan float.
sumber
sebagai contoh
dan hasilnya
sumber
Contoh:
sumber
sumber
Saya selalu mengira
avg
dihilangkan dari builtins / stdlib karena sesederhana itudan setiap peringatan akan dialamatkan dalam kode penelepon untuk penggunaan lokal .
Peringatan penting:
hasil non-float: di python2, 9/4 adalah 2. untuk menyelesaikan, menggunakan
float(sum(L))/len(L)
ataufrom __future__ import division
pembagian dengan nol: daftar mungkin kosong. untuk menyelesaikan:
sumber
Jawaban yang tepat untuk pertanyaan Anda adalah menggunakan
statistics.mean
. Tapi untuk bersenang-senang, ini adalah versi rata-rata yang tidak menggunakanlen()
fungsi, sehingga (sepertistatistics.mean
) dapat digunakan pada generator, yang tidak mendukunglen()
:sumber
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):
sumber