np.mean () против np.average () в Python NumPy?


191

Я замечаю что

In [30]: np.mean([1, 2, 3])
Out[30]: 2.0

In [31]: np.average([1, 2, 3])
Out[31]: 2.0

Однако должны быть некоторые различия, поскольку в конце концов они представляют собой две разные функции.

Каковы различия между ними?


20
На самом деле, насколько я могу судить, документация не дает ясности сразу. Не сказать, что это невозможно сказать, но я думаю, что этот вопрос все же актуален для переполнения стека.
BlackVegetarian

1
numpy.mean: возвращает среднее значение элементов массива.
Хоакин

@joaquin: «Вычислить среднее арифметическое вдоль указанной оси». vs "Вычислить средневзвешенное значение по указанной оси."
Блендер

@ Блендер правильно. Я просто пытался сделать своего рода забавный ответ на ваш комментарий, потому что, если я последую вашим инструкциям, первое, что я прочитал в документации для numpy.mean, это numpy.mean: Возвращает среднее значение элементов массива, что забавно, если вы ищу ответ на вопрос ОП.
Хоакин

Ответы:


181

np.average принимает необязательный весовой параметр. Если он не поставляется, они эквивалентны. Взгляните на исходный код: Среднее , Среднее

np.mean:

try:
    mean = a.mean
except AttributeError:
    return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)

np.average:

...
if weights is None :
    avg = a.mean(axis)
    scl = avg.dtype.type(a.size/avg.size)
else:
    #code that does weighted mean here

if returned: #returned is another optional argument
    scl = np.multiply(avg, 0) + scl
    return avg, scl
else:
    return avg
...

60
Почему они предлагают две разные функции? Кажется, они должны просто предложить, np.averageтак как weightsэто уже необязательно. Кажется ненужным и служит только для запутывания пользователей.
Джефф

6
@Geoff Я бы предпочел, чтобы они генерировали NotImplementedException для «среднего», чтобы информировать пользователей о том, что среднее арифметическое не совпадает со «средним».
FooBar

27

np.mean всегда вычисляет среднее арифметическое и имеет некоторые дополнительные параметры для ввода и вывода (например, какие типы данных использовать, где разместить результат).

np.averageможет вычислить средневзвешенное значение, если weightsуказан параметр.


25

В какой-то версии numpy есть еще одно важное отличие, о котором вы должны знать:

average не учитывайте маски, поэтому рассчитывайте среднее значение по всему набору данных.

mean учитывает маски, поэтому вычисляйте среднее значение только по немаскированным значениям.

g = [1,2,3,55,66,77]
f = np.ma.masked_greater(g,5)

np.average(f)
Out: 34.0

np.mean(f)
Out: 2.0

1
Примечание: np.ma.averageработает. Также есть отчет об ошибке .
Нил Дж

2

В вашем вызове две функции одинаковы.

average может вычислить средневзвешенное значение, хотя.

Ссылки на документы: meanиaverage


0

В дополнение к уже отмеченным различиям, есть еще одно чрезвычайно важное отличие, которое я только что обнаружил трудным путем: в отличие от него np.mean, ключевое слово np.averageне допускается dtype, что важно для получения правильных результатов в некоторых случаях. У меня очень большой массив одинарной точности, доступ к которому осуществляется из h5файла. Если я возьму среднее значение по осям 0 и 1, я получу дико неверные результаты, если не укажу dtype='float64':

>T.shape
(4096, 4096, 720)
>T.dtype
dtype('<f4')

m1 = np.average(T, axis=(0,1))                #  garbage
m2 = np.mean(T, axis=(0,1))                   #  the same garbage
m3 = np.mean(T, axis=(0,1), dtype='float64')  # correct results

К сожалению, если вы не знаете, что искать, вы не можете сказать, что ваши результаты неверны. Я никогда не буду использовать np.averageснова по этой причине, но всегда буду использовать np.mean(.., dtype='float64')для любого большого массива. Если мне нужно средневзвешенное значение, я вычислю его явно, используя произведение вектора весов и целевого массива, а затем либо, np.sumлибо np.mean, в зависимости от ситуации (также с соответствующей точностью).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.