numpy.mean, если вы можете позволить себе установку numpy
mitch
7
sum(L) / float(len(L)), обрабатывать пустые списки в коде вызывающего абонента, например,if not L: ...
n611x007,
4
@mitch: дело не в том, можете ли вы позволить себе установку numpy. Numpy это целое слово само по себе. Нужно ли вам на самом деле NumPy. Установка numpy, расширения C на 16 Мб, для вычисления среднего значения была бы очень непрактичной для тех, кто не использует его для других целей.
n611x007
3
вместо того, чтобы устанавливать весь пакет NumPy всего за avg / mean, если вы используете Python 3, мы можем сделать это, используя модуль статистики, просто «из среднего значения импорта статистики» или, если на Python 2.7 или менее, модуль статистики можно загрузить из src: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html и используется напрямую.
если список состоит из целых чисел, результатом под python 2 будет int
mitch
Отлично ! извините за глупый вопрос, но я искренне искал это везде! Спасибо вам большое !
Карла Десси
7
Как я уже сказал, я новичок в этом, я думал, что мне нужно сделать это с помощью цикла или чего-то еще, чтобы посчитать количество чисел в нем, я не знал, что могу просто использовать длину. это первое, что я сделал с питоном ..
Карла Десси
2
Что делать, если сумма - это огромное число, которое не помещается в int / float?
Пользователь Foo Bar
5
@FooBarUser тогда вы должны вычислить k = 1,0 / лен (л), а затем уменьшить: уменьшить (лямбда х, у: х + у * к, л)
Это странно. Я бы предположил, что это будет намного эффективнее, но, похоже, это займет в 8 раз больше времени в случайном списке чисел, чем простоsum(l)/len(l)
L. Amber O'Hearn
8
Да, но np.array(l).mean()это намного быстрее.
Л. Амбер О'Хирн,
8
@ L.AmberO'Hearn, я просто засек и np.mean(l)и np.array(l).meanпримерно с той же скоростью, и sum(l)/len(l)примерно в два раза быстрее. Я использовал l = list(np.random.rand(1000)), конечно, оба numpyметода стали намного быстрее, если lесть numpy.array.
Akavall
11
ну, если только это не единственная причина для установки NumPy. установка 16-мегабайтного C-пакета любой известности для вычисления среднего значения в этом масштабе выглядит очень странно.
n611x007
но на мой взгляд. нет необходимости заботиться о скорости в нормальном состоянии ..
Тян
230
Модуль статистики был добавлен в Python 3.4 . У него есть функция для вычисления среднего, называемого средним . Пример с предоставленным вами списком будет:
from statistics import mean
l =[15,18,2,36,12,78,5,6,9]
mean(l)
Это самый элегантный ответ, потому что он использует стандартный модуль библиотеки, который доступен начиная с python 3.4.
Серж Строобандт
4
И это численно стабильнее
Антти Хаапала
И это приводит к ошибке лучше , если вы случайно пройти в пустом списке statistics.StatisticsError: mean requires at least one data pointвместо более загадочного ZeroDivisionError: division by zeroдля sum(x) / len(x)решения.
Борис
45
Зачем вам использовать reduce()это, когда Python имеет совершенно громоздкую sum()функцию?
print sum(l)/ float(len(l))
( float()Необходимо заставить Python выполнять деление с плавающей запятой.)
Я понимаю, что это просто для удовольствия, но возвращение 0 для пустого списка может быть не лучшим решением
Йохан Лундберг
1
@JohanLundberg - Вы можете заменить 0 на False в качестве последнего аргумента, reduce()который даст вам False для пустого списка, в противном случае среднее значение, как раньше.
Эндрю Кларк
@AndrewClark почему вы заставляете floatна len?
EndermanAPM
8
Я попытался использовать варианты выше, но не сработало. Попробуй это:
from statistics import mean
n =[11,13,15,17,19]print(n)print(mean(n))
Хорошо. Любой другой ответ не заметил опасности пустого списка!
wsysuper
1
Возвращение False(эквивалентное целому числу 0) - это наихудший из возможных способов справиться с этой ошибкой. Лучше поймать ZeroDivisionErrorи поднять что-нибудь получше (возможно ValueError).
добро пожаловать
@ kindall как ValueErrorлучше, чем ZeroDivisionError? Последний является более конкретным, и, кроме того, кажется, что нет необходимости отлавливать арифметическую ошибку только для того, чтобы перебросить другую.
MatTheWhale
Потому что ZeroDivisionErrorэто полезно, только если вы знаете, как выполняется вычисление (т. Е. Используется деление на длину списка). Если вы этого не знаете, это не скажет вам, в чем проблема со значением, которое вы передали. В то время как ваше новое исключение может включать эту более конкретную информацию.
любезно
4
как новичок, я только что написал это:
L =[15,18,2,36,12,78,5,6,9]
total =0def average(numbers):
total = sum(numbers)
total = float(total)return total / len(numbers)print average(L)
Для того, чтобы использовать reduceдля получения скользящего среднего, вам нужно отследить общее количество, а также общее количество элементов, видимых до сих пор. поскольку это не тривиальный элемент в списке, вам также нужно будет передать reduceдополнительный аргумент, чтобы сложить его.
Оба могут дать вам близкие к аналогичным значениям по целому или по крайней мере 10 десятичных значений. Но если вы действительно рассматриваете длинные плавающие значения, оба могут быть разными. Подход может варьироваться в зависимости от того, чего вы хотите достичь.
>>> l =[15,18,2,36,12,78,5,6,9]>>>print reduce(lambda x, y: x + y, l)/ len(l)20>>> sum(l)/len(l)20
Плавающие значения
>>>print reduce(lambda x, y: x + y, l)/ float(len(l))20.1111111111>>>print sum(l)/float(len(l))20.1111111111
x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03],
[-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33],
[-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]
Вы можете заметить, что xимеет размерность 3 * 10, если вам нужно получить в meanкаждой строке, вы можете напечатать это
Комбинируя пару приведенных выше ответов, я пришел к следующему, которое работает с Reduce и не предполагает, что вы имеете Lдоступ к функции Reduction:
from operator import truediv
L =[15,18,2,36,12,78,5,6,9]def sum_and_count(x, y):try:return(x[0]+ y, x[1]+1)exceptTypeError:return(x + y,2)
truediv(*reduce(sum_and_count, L))# prints 20.11111111111111
numbers =[0,1,2,3]
numbers[0]= input("Please enter a number")
numbers[1]= input("Please enter a second number")
numbers[2]= input("Please enter a third number")
numbers[3]= input("Please enter a fourth number")print(numbers)print("Finding the Avarage")
avarage = int(numbers[0])+ int(numbers[1])+ int(numbers[2])+ int(numbers [3])/4print(avarage)
sum(L) / float(len(L))
, обрабатывать пустые списки в коде вызывающего абонента, например,if not L: ...
Ответы:
На Python 3.4+ вы можете использовать
statistics.mean()
На старых версиях Python вы можете сделать
В Python 2 вам нужно преобразовать
len
в число с плавающей точкой, чтобы получить деление числа с плавающей точкойТам нет необходимости использовать
reduce
. Это намного медленнее и было удалено в Python 3.источник
источник
from __future__ import division
, вы можете устранить это безобразноеfloat
.float
ужасен, просто хотел, чтобы все было проще.sum(l, 0.0) / len(l)
sum(l) / len(l)
Вы можете использовать
numpy.mean
:источник
sum(l)/len(l)
np.array(l).mean()
это намного быстрее.np.mean(l)
иnp.array(l).mean
примерно с той же скоростью, иsum(l)/len(l)
примерно в два раза быстрее. Я использовалl = list(np.random.rand(1000))
, конечно, обаnumpy
метода стали намного быстрее, еслиl
естьnumpy.array
.Модуль статистики был добавлен в Python 3.4 . У него есть функция для вычисления среднего, называемого средним . Пример с предоставленным вами списком будет:
источник
statistics.StatisticsError: mean requires at least one data point
вместо более загадочногоZeroDivisionError: division by zero
дляsum(x) / len(x)
решения.Зачем вам использовать
reduce()
это, когда Python имеет совершенно громоздкуюsum()
функцию?(
float()
Необходимо заставить Python выполнять деление с плавающей запятой.)источник
float()
не нужно на Python 3.Есть библиотека статистики, если вы используете python> = 3.4
https://docs.python.org/3/library/statistics.html
Вы можете использовать это подлый метод, как это. Допустим, у вас есть список чисел, которые вы хотите найти среднее:
У него есть и другие методы, такие как stdev, дисперсия, мода, среднее гармоническое, медиана и т. Д., Которые слишком полезны.
источник
Вместо того, чтобы бросать в плавающее, вы можете добавить 0.0 к сумме:
источник
sum(l) / float(len(l))
это правильный ответ, но просто для полноты вы можете вычислить среднее значение с одним уменьшением:Обратите внимание, что это может привести к небольшой ошибке округления:
источник
reduce()
который даст вам False для пустого списка, в противном случае среднее значение, как раньше.float
наlen
?Я попытался использовать варианты выше, но не сработало. Попробуй это:
работал на питоне 3.5
источник
Или используйте
pandas
«sSeries.mean
метод:Демо-версия:
Из документов:
И вот документы для этого:
И вся документация:
источник
У меня был похожий вопрос для решения проблем Udacity. Вместо встроенной функции я написал:
Гораздо дольше, чем обычно, но для новичка это довольно сложно.
источник
False
(эквивалентное целому числу0
) - это наихудший из возможных способов справиться с этой ошибкой. Лучше пойматьZeroDivisionError
и поднять что-нибудь получше (возможноValueError
).ValueError
лучше, чемZeroDivisionError
? Последний является более конкретным, и, кроме того, кажется, что нет необходимости отлавливать арифметическую ошибку только для того, чтобы перебросить другую.ZeroDivisionError
это полезно, только если вы знаете, как выполняется вычисление (т. Е. Используется деление на длину списка). Если вы этого не знаете, это не скажет вам, в чем проблема со значением, которое вы передали. В то время как ваше новое исключение может включать эту более конкретную информацию.как новичок, я только что написал это:
источник
sum(l)/len(l)
безусловно, самый элегантный ответ (нет необходимости делать преобразования типов в Python 3).Если вы хотите получить больше, чем просто среднее значение (среднее), вы можете проверить статистику scipy
источник
Для того, чтобы использовать
reduce
для получения скользящего среднего, вам нужно отследить общее количество, а также общее количество элементов, видимых до сих пор. поскольку это не тривиальный элемент в списке, вам также нужно будет передатьreduce
дополнительный аргумент, чтобы сложить его.источник
Оба могут дать вам близкие к аналогичным значениям по целому или по крайней мере 10 десятичных значений. Но если вы действительно рассматриваете длинные плавающие значения, оба могут быть разными. Подход может варьироваться в зависимости от того, чего вы хотите достичь.
Плавающие значения
@ Эндрю Кларк был прав в своем заявлении.
источник
Предположим, что
x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03], [-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33], [-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]
Вы можете заметить, что
x
имеет размерность 3 * 10, если вам нужно получить вmean
каждой строке, вы можете напечатать этоне забудь
import numpy as np
источник
источник
Найти среднее значение в списке, используя следующий код PYTHON :
попробуйте это легко.
источник
или как опубликовано ранее
1.0 - убедиться, что вы получили деление с плавающей запятой
источник
Комбинируя пару приведенных выше ответов, я пришел к следующему, которое работает с Reduce и не предполагает, что вы имеете
L
доступ к функции Reduction:источник
Я хочу добавить еще один подход
источник
источник