Как найти среднее геометрическое в пайтоне

  • Редакция Кодкампа

17 авг. 2022 г.
читать 1 мин


В Python есть два способа вычисления среднего геометрического:

Метод 1: вычислить среднее геометрическое с помощью SciPy

from scipy. stats import gmean

#calculate geometric mean
gmean([value1, value2, value3, ...])

Метод 2: вычислить среднее геометрическое с помощью NumPy

import numpy as np

#define custom function
def g_mean(x):
 a = np.log (x)
 return np.exp (a.mean())

#calculate geometric mean 
g_mean([value1, value2, value3, ...])

Оба метода вернут одинаковые результаты.

В следующих примерах показано, как использовать каждый из этих методов на практике.

Пример 1: расчет среднего геометрического с помощью SciPy

В следующем коде показано, как использовать функцию gmean() из библиотеки SciPy для вычисления среднего геометрического массива значений:

from scipy. stats import gmean

#calculate geometric mean
gmean([1, 4, 7, 6, 6, 4, 8, 9])

4.81788719702029

Среднее геометрическое оказывается равным 4,8179 .

Пример 2: вычисление среднего геометрического с использованием NumPy

В следующем коде показано, как написать пользовательскую функцию для вычисления среднего геометрического с использованием встроенных функций из библиотеки NumPy :

import numpy as np

#define custom function
def g_mean(x):
 a = np.log (x)
 return np.exp (a.mean())

#calculate geometric mean
g_mean([1, 4, 7, 6, 6, 4, 8, 9])

4.81788719702029

Среднее геометрическое оказывается равным 4,8179 , что соответствует результату из предыдущего примера.

Как обращаться с нулями

Обратите внимание, что оба метода возвращают ноль, если в массиве, с которым вы работаете, есть нули.

Таким образом, вы можете использовать следующий фрагмент кода, чтобы удалить все нули из массива перед вычислением среднего геометрического:

#create array with some zeros
x = [1, 0, 0, 6, 6, 0, 8, 9]

#remove zeros from array 
x_new = [i for i in x if i != 0]

#view updated array
print(x_new)

[1, 6, 6, 8, 9]

Дополнительные ресурсы

Как рассчитать среднеквадратичную ошибку (MSE) в Python
Как рассчитать среднюю абсолютную ошибку в Python

While working with Python, we can have a problem in which we need to find geometric mean of a list cumulative. This problem is common in Data Science domain. Let’s discuss certain ways in which this problem can be solved. 
Method #1 : Using loop + formula The simpler manner to approach this problem is to employ the formula for finding geometric mean and perform using loop shorthands. This is the most basic approach to solve this problem. 

Python3

import math

test_list = [6, 7, 3, 9, 10, 15]

print("The original list is : " + str(test_list))

temp = 1

for i in range(0, len(test_list)) :

    temp = temp * test_list[i]

temp2 = (float)(math.pow(temp, (1 / len(test_list))))

res = (float)(temp2)

print("The geometric mean of list is : " + str(res))

Output : 

The original list is : [6, 7, 3, 9, 10, 15]
The geometric mean of list is : 7.443617568993922

Time Complexity: O(n), where n is the length of the input list. This is because we’re using the loop + formula which has a time complexity of O(n) in the worst case.
Auxiliary Space: O(1), as we’re using constant additional space

  Method #2 : Using statistics.geometric_mean() This task can also be performed using inbuilt function of geometric_mean(). This is new in Python versions >= 3.8. 

Python3

import statistics

test_list = [6, 7, 3, 9, 10, 15]

print("The original list is : " + str(test_list))

res = statistics.geometric_mean(test_list, 1)

print("The geometric mean of list is : " + str(res))

Output : 

The original list is : [6, 7, 3, 9, 10, 15]
The geometric mean of list is : 7.443617568993922

Time Complexity: O(n), where n is the number of elements in the list “test_list”.
Auxiliary Space: O(1), constant extra space is required

Method #3: Using numpy library

Note: Install numpy module using command “pip install numpy”

We can use the numpy library which has a numpy.prod() function to find the product of all elements in the list and then use numpy.power() function with the reciprocal of the length of the list as the exponent to find the geometric mean.

Python

import numpy as np

test_list = [6, 7, 3, 9, 10, 15]

print("The original list is : " + str(test_list))

result = np.power(np.prod(test_list), 1/len(test_list))

print("The geometric mean of list is : " + str(result))

Output:

The original list is : [6, 7, 3, 9, 10, 15]
The geometric mean of list is : 7.443617568993922

Time complexity: O(n)
Auxiliary space: O(1)

Last Updated :
09 Apr, 2023

Like Article

Save Article

Среднее геометрическое элементов последовательности.

Синтаксис:

import statistics

# Новое в Python 3.8.
statistics.geometric_mean(data)

Параметры:

  • data – данные, последовательность или итерация.

Возвращаемое значение:

  • возвращает среднее геометрическое элементов последовательности.

Описание:

Функция geometric_mean() модуля statistics преобразует элементы последовательности data в числа с плавающей запятой float и вычисляет и возвращает среднее геометрическое этой последовательности.

Среднее геометрическое элементов последовательности указывает центральную тенденцию или типичное значение данных с использованием произведения элементов этой последовательности (в отличие от среднего арифметического, которое использует их сумму).

Аргумент data может быть последовательностью или итерацией. Если последовательность данных data пуста, содержит ноль или отрицательное значение, то функция statistics.geometric_mean() вызывает ошибку StatisticsError.

Никаких особых усилий для достижения точных результатов не предпринимается, что может измениться в будущем.

Примеры использования функции statistics.geometric_mean():

>>> import statistics
>>> g_mean = statistics.geometric_mean([54, 24, 36])
>>> round(g_mean, 1)
# 36.0

>>> from fractions import Fraction as F
>>> statistics.geometric_mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
# 0.3263118562050573

I wonder is there any easy way to do geometric mean using python but without using python package. If there is not, is there any simple package to do geometric mean?

asked Mar 29, 2017 at 16:48

3

The formula of the gemetric mean is:

geometrical mean

So you can easily write an algorithm like:

import numpy as np

def geo_mean(iterable):
    a = np.array(iterable)
    return a.prod()**(1.0/len(a))

You do not have to use numpy for that, but it tends to perform operations on arrays faster than Python. See this answer for why.

In case the chances of overflow are high, you can map the numbers to a log domain first, calculate the sum of these logs, then multiply by 1/n and finally calculate the exponent, like:

import numpy as np

def geo_mean_overflow(iterable):
    return np.exp(np.log(iterable).mean())

answered Mar 29, 2017 at 17:00

Willem Van Onsem's user avatar

Willem Van OnsemWillem Van Onsem

434k29 gold badges419 silver badges540 bronze badges

7

In case someone is looking here for a library implementation, there is gmean() in scipy, possibly faster and numerically more stable than a custom implementation:

>>> from scipy.stats import gmean
>>> gmean([1.0, 0.00001, 10000000000.])
46.415888336127786

Compatible with both Python 2 and 3.*

answered Nov 28, 2018 at 19:00

Marcin Wojnarski's user avatar

0

Starting Python 3.8, the standard library comes with the geometric_mean function as part of the statistics module:

from statistics import geometric_mean

geometric_mean([1.0, 0.00001, 10000000000.]) # 46.415888336127786

answered Apr 7, 2019 at 17:55

Xavier Guihot's user avatar

Xavier GuihotXavier Guihot

52.9k21 gold badges285 silver badges186 bronze badges

1

just do this:

numbers = [1, 3, 5, 7, 10]


print reduce(lambda x, y: x*y, numbers)**(1.0/len(numbers))

answered Mar 29, 2017 at 16:51

Liam's user avatar

LiamLiam

5,9194 gold badges39 silver badges53 bronze badges

1

Here’s an overflow-resistant version in pure Python, basically the same as the accepted answer.

import math

def geomean(xs):
    return math.exp(math.fsum(math.log(x) for x in xs) / len(xs))

answered May 20, 2019 at 22:41

rmmh's user avatar

rmmhrmmh

6,98125 silver badges37 bronze badges

You can also calculate the geometrical mean with numpy:

import numpy as np
np.exp(np.mean(np.log([1, 2, 3])))

result:

1.8171205928321397

answered May 12, 2020 at 21:19

gil.fernandes's user avatar

gil.fernandesgil.fernandes

12.6k5 gold badges60 silver badges75 bronze badges

you can use pow function, as follows :

def p(*args):
    k=1
    for i in args:
        k*=i
    return pow(k, 1/len(args))]

>>> p(2,3)
2.449489742783178

Asclepius's user avatar

Asclepius

56.3k17 gold badges163 silver badges142 bronze badges

answered Dec 25, 2020 at 11:36

Bairam Komaki's user avatar

Geometric mean
import pandas as pd
geomean=Variable.product()**(1/len(Variable))
print(geomean)
Geometric mean with Scipy
from scipy import stats
print(stats.gmean(Variable))

Asclepius's user avatar

Asclepius

56.3k17 gold badges163 silver badges142 bronze badges

answered Oct 30, 2019 at 7:02

user12295593's user avatar

1 / 1 / 0

Регистрация: 15.09.2015

Сообщений: 17

1

Найти среднее арифметическое и геометрическое

15.09.2015, 17:16. Показов 32036. Ответов 4


Студворк — интернет-сервис помощи студентам

только начинаю изучение питона
помогите с задачами, пожалуйста
4) Даны 2 числа. Найти среднее арифметическое и геометрическое их модулей. Сравнить результаты.



0



DeD_SnEGuR

2 / 2 / 0

Регистрация: 23.09.2015

Сообщений: 15

06.10.2015, 17:56

2

AprilNevada,

Python
1
2
3
4
5
6
7
8
9
10
11
12
from math import sqrt
a=float(input('a='))
b=float(input('b='))
c=(a+b)/2   #среднее арифметическое
d=sqrt(a*b) #среднее геометрич
if c!=b:
    if c>d:
        print('среднее арифметическое больше среднего геометич ')
    else:
        print('среднее арифметическое меньше среднее геометрич ')
else:
    print('равны ')



0



Marinero

Эксперт NIX

2793 / 2036 / 682

Регистрация: 02.03.2015

Сообщений: 6,509

06.10.2015, 19:13

3

DeD_SnEGuR,

Python
2
3
a=abs(float(input('a=')))
b=abs(float(input('b=')))



1



Эксперт Python

4607 / 2028 / 359

Регистрация: 17.03.2012

Сообщений: 10,086

Записей в блоге: 6

07.10.2015, 14:28

4

А зачем?
Среднее арифметическое всегда больше либо равно среднему геометрическому. Причём равно только тогда, когда сами числа равны.



1



2 / 2 / 0

Регистрация: 23.09.2015

Сообщений: 15

07.10.2015, 15:54

5

Marinero, верноо . не обратил внимание на модуль
dondublon, чсно я вообще не вижу смысла сравнивать



0



Добавить комментарий