Я замечаю что
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
В вашем вызове две функции одинаковы.
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
, в зависимости от ситуации (также с соответствующей точностью).