eu reparei nisso
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
No entanto, deve haver algumas diferenças, pois, afinal, são duas funções diferentes.
Quais são as diferenças entre eles?
eu reparei nisso
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
No entanto, deve haver algumas diferenças, pois, afinal, são duas funções diferentes.
Quais são as diferenças entre eles?
Respostas:
np.average usa um parâmetro de peso opcional. Se não for fornecido, eles são equivalentes. Dê uma olhada no código-fonte: Média , Média
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.averageuma vez que weightsjá é opcional. Parece desnecessário e serve apenas para confundir os usuários.
Em alguma versão do numpy há outra diferença importante que você deve estar ciente:
average não leve em consideração as máscaras; portanto, calcule a média de todo o conjunto de dados.
mean leva em conta máscaras, então calcule a média somente sobre valores não mascarados.
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.averagefunciona. Além disso, há um relatório de bug .
Na sua invocação, as duas funções são iguais.
average pode calcular uma média ponderada.
Além das diferenças já observadas, há outra diferença extremamente importante que acabei de descobrir da maneira mais difícil: ao contrário np.mean, np.averagenão permite a dtypepalavra - chave, que é essencial para obter resultados corretos em alguns casos. Eu tenho uma matriz de precisão única muito grande que é acessada a partir de um h5arquivo. Se eu pegar a média ao longo dos eixos 0 e 1, obtenho resultados extremamente incorretos, a menos que eu especifique 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
Infelizmente, a menos que você saiba o que procurar, não pode necessariamente dizer que seus resultados estão errados. Eu nunca usarei np.averagenovamente por esse motivo, mas sempre utilizarei np.mean(.., dtype='float64')em qualquer matriz grande. Se eu quiser uma média ponderada, eu a computarei explicitamente usando o produto do vetor de ponderação e a matriz de destino e, em seguida, ou np.sumou np.mean, conforme apropriado (com precisão apropriada também).