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.average
uma vez que weights
já é 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.average
funciona. 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.average
não permite a dtype
palavra - 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 h5
arquivo. 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.average
novamente 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.sum
ou np.mean
, conforme apropriado (com precisão apropriada também).