np.mean () vs np.average () no Python NumPy?

189

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?

Sibbs Gambling
fonte
20
Na verdade, a documentação não deixa imediatamente claro, até onde eu posso ver. Não estou dizendo que é impossível dizer, mas acho que essa pergunta é válida para Stack Overflow da mesma forma.
BlackVegetable
1
numpy.mean: retorna a média dos elementos da matriz.
Joaquin
@joaquin: "Calcule a média aritmética ao longo do eixo especificado." vs "Calcular a média ponderada ao longo do eixo especificado."?
Blender
@Blender certo. Eu estava apenas tentando dar uma resposta engraçada ao seu comentário, porque se eu seguir suas instruções, a primeira coisa que li nos documentos para numpy.mean é numpy.mean: retorna a média dos elementos da matriz que são engraçados se você estiver procurando a resposta para a pergunta do OP.
Joaquin

Respostas:

180

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
...
Martelo
fonte
59
Por que eles oferecem duas funções diferentes? Parece que eles deveriam apenas oferecer np.averageuma vez que weightsjá é opcional. Parece desnecessário e serve apenas para confundir os usuários.
Geoff
6
@ Geoff Eu preferiria que eles lançassem uma NotImplementedException para "média", para informar aos usuários que a média aritmética não é idêntica à "média".
FooBar
26

np.mean sempre calcula uma média aritmética e tem algumas opções adicionais para entrada e saída (por exemplo, quais tipos de dados usar, onde colocar o resultado).

np.averagepode calcular uma média ponderada se o weightsparâmetro for fornecido.

Âmbar
fonte
24

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
GM
fonte
1
Nota: np.ma.averagefunciona. Além disso, há um relatório de bug .
Neil G
2

Na sua invocação, as duas funções são iguais.

average pode calcular uma média ponderada.

Links do documento: meaneaverage

Prashant Kumar
fonte
0

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).

Grant Petty
fonte