Я це помічаю
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
Однак мають бути певні відмінності, адже зрештою це дві різні функції.
Які відмінності між ними?
Я це помічаю
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
Однак мають бути певні відмінності, адже зрештою це дві різні функції.
Які відмінності між ними?
Відповіді:
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
...
np.average
оскільки weights
це вже необов'язково. Здається непотрібним і служить лише для заплутування користувачів.
У деяких версіях 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
np.ma.average
працює. Також є звіт про помилку .
У вашій виклику дві функції однакові.
average
але можна обчислити середньозважене.
Окрім вже відзначених відмінностей, є ще одна надзвичайно важлива відмінність, яку я щойно відкрив для себе важким шляхом: на відміну від цього 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
, як доречно (з відповідною точністю).