Có phương pháp thư viện chuẩn hoặc tích hợp trong Python để tính trung bình số học (một loại trung bình) của danh sách các số không?
Có phương pháp thư viện chuẩn hoặc tích hợp trong Python để tính trung bình số học (một loại trung bình) của danh sách các số không?
Câu trả lời:
Tôi không nhận thức được bất cứ điều gì trong thư viện tiêu chuẩn. Tuy nhiên, bạn có thể sử dụng một cái gì đó như:
def mean(numbers):
return float(sum(numbers)) / max(len(numbers), 1)
>>> mean([1,2,3,4])
2.5
>>> mean([])
0.0
Trong numpy, có numpy.mean()
.
[]
là 0
, có thể được thực hiện bằng float(sum(l))/max(len(l),1)
.
max
?
NumPy có numpy.mean
nghĩa là số học. Cách sử dụng đơn giản như thế này:
>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335
Sử dụng statistics.mean
:
import statistics
print(statistics.mean([1,2,4])) # 2.3333333333333335
Nó có sẵn kể từ Python 3.4. Đối với người dùng 3.1-3.3, phiên bản cũ của mô-đun có sẵn trên PyPI dưới tên stats
. Chỉ cần thay đổi statistics
thành stats
.
timeit("numpy.mean(vec))
, timeit("sum(vec)/len(vec)")
và timeit("statistics.mean(vec)")
- cái sau chậm hơn các yếu tố khác bởi một yếu tố rất lớn (> 100 trong một số trường hợp trên PC của tôi). Điều này dường như là do việc triển khai đặc biệt chính xác của sum
toán tử trong statistics
, xem PEP và Code . Không chắc chắn về lý do cho sự khác biệt hiệu suất lớn giữa statistics._sum
và numpy.sum
, mặc dù.
statistics.mean
cố gắng để được chính xác . Nó tính toán chính xác trung bình của [1e50, 1, -1e50] * 1000
.
statistics.mean
cũng sẽ chấp nhận biểu thức của các giá trị mà tất cả các giải pháp sử dụng len()
cho ước số sẽ bị nghẹt.
Bạn thậm chí không cần numpy hoặc scipy ...
>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
from __future__ import division
ở đầu chương trình của mình
a = list()
? Các mã đề xuất kết quả trong ZeroDivisionError
.
Sử dụng scipy:
import scipy;
a=[1,2,4];
print(scipy.mean(a));
Thay vì đúc để nổi, bạn có thể làm theo
def mean(nums):
return sum(nums, 0.0) / len(nums)
hoặc sử dụng lambda
mean = lambda nums: sum(nums, 0.0) / len(nums)
CẬP NHẬT: 2019-12-15
Python 3.8 đã thêm chức năng fmean vào mô-đun thống kê . Cái nào nhanh hơn và luôn trả về float.
Chuyển đổi dữ liệu thành số float và tính trung bình số học.
Điều này chạy nhanh hơn hàm mean () và nó luôn trả về một float. Dữ liệu có thể là một chuỗi hoặc lặp lại. Nếu tập dữ liệu đầu vào trống, hãy tăng StatisticsError.
fmean ([3.5, 4.0, 5.25])
4,25
Mới trong phiên bản 3.8.
from statistics import mean
avarage=mean(your_list)
ví dụ
from statistics import mean
my_list=[5,2,3,2]
avarage=mean(my_list)
print(avarage)
và kết quả là
3.0
def avg(l):
"""uses floating-point division."""
return sum(l) / float(len(l))
l1 = [3,5,14,2,5,36,4,3]
l2 = [0,0,0]
print(avg(l1)) # 9.0
print(avg(l2)) # 0.0
Tôi luôn luôn avg
bị bỏ qua khỏi các nội dung / stdlib vì nó đơn giản như
sum(L)/len(L) # L is some list
và bất kỳ cảnh báo nào sẽ được giải quyết trong mã người gọi để sử dụng cục bộ .
Hãy cẩn thận:
kết quả không nổi: trong python2, 9/4 là 2. để giải quyết, sử dụng float(sum(L))/len(L)
hoặcfrom __future__ import division
chia cho số không: danh sách có thể trống. để giải quyết:
if not L:
raise WhateverYouWantError("foo")
avg = float(sum(L))/len(L)
Câu trả lời thích hợp cho câu hỏi của bạn là sử dụng statistics.mean
. Nhưng để giải trí, đây là một phiên bản có nghĩa là không sử dụng len()
chức năng, vì vậy nó (như statistics.mean
) có thể được sử dụng trên các máy phát điện, không hỗ trợ 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)))
Những người khác đã đăng câu trả lời rất hay, nhưng một số người vẫn có thể đang tìm kiếm một cách cổ điển để tìm Nghĩa (avg), vì vậy ở đây tôi đăng bài này (mã được thử nghiệm trong 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