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
Насправді, наскільки я бачу, документація не дає зрозуміти це відразу. Не сказати, що неможливо сказати, але я думаю, що це питання справедливе для Stack Overflow все одно.
BlackVegetable

1
numpy.mean: Повертає середнє значення елементів масиву.
Жоакін

@joaquin: "Обчислити середнє арифметичне вздовж зазначеної осі." vs "Обчислити середньозважене вздовж зазначеної осі."
Блендер

@Blender справа. Я просто намагався зробити якусь смішну відповідь на ваш коментар, тому що якщо я дотримуюся ваших інструкцій, перше, що я прочитав у документах для 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працює. Також є звіт про помилку .
Ніл G


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.