파이썬 NumPy에서 np.mean () 대 np.average ()?


191

나는

In [30]: np.mean([1, 2, 3])
Out[30]: 2.0

In [31]: np.average([1, 2, 3])
Out[31]: 2.0

그러나 두 가지 기능이 있기 때문에 약간의 차이가 있습니다.

그들 사이의 차이점은 무엇입니까?


20
실제로 문서는 내가 볼 수있는 한 즉시 명확하게하지 않습니다. 말할 수는 없지만,이 질문은 Stack Overflow에 동일하게 유효하다고 생각합니다.
BlackVegetable

1
numpy.mean : 배열 요소의 평균을 반환합니다.
joaquin

@joaquin : "지정된 축을 따라 산술 평균을 계산하십시오." vs "지정된 축을 따라 가중 평균을 계산합니다."?
Blender

@ 블렌더 맞아. 난 그냥 당신의 지시에 내가 읽어 제일 먼저 따르는 경우 때문에 귀하의 코멘트에 재미 응답의 종류를 만들려고 노력했다 numpy.mean에 대한 문서를 입니다 numpy.mean : 배열 요소의 평균 반환 당신이 경우에 재미이다 OP 질문에 대한 답변을 찾고 있습니다.
joaquin

답변:


181

np.average는 선택적 무게 매개 변수를 사용합니다. 제공되지 않으면 동일합니다. 소스 코드를 살펴보십시오 : Mean , Average

np. 평균 :

try:
    mean = a.mean
except AttributeError:
    return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)

np. 평균 :

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

60
왜 두 가지 기능을 제공합니까? 이미 선택 사항 np.average이므로 그들이 제공 해야하는 것 같습니다 weights. 불필요한 것처럼 보이며 사용자를 혼란스럽게합니다.
Geoff

6
@Geoff 나는 "평균"에 대해 NotImplementedException을 던져서 산술 평균이 "평균"과 동일하지 않다는 것을 사용자에게 교육시킨다.
FooBar

27

np.mean 항상 산술 평균을 계산하고 입력 및 출력에 대한 몇 가지 추가 옵션 (예 : 사용할 데이터 유형, 결과 위치)이 있습니다.

np.averageweights매개 변수가 제공 되면 가중 평균을 계산할 수 있습니다 .


25

일부 버전의 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

1
참고 : np.ma.average작동합니다. 또한 버그 리포트가 있습니다.
Neil G


0

이미 언급 한 차이뿐만 아니라, 내가 지금 어려운 방법을 발견 한 또 다른 매우 중요한 차이가 있습니다 : 달리 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적절한 (적절한 정밀도로) 계산합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.