それに気づく
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
ただし、やはり2つの異なる関数であるため、いくつかの違いがあるはずです。
それらの違いは何ですか?
それに気づく
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
ただし、やはり2つの異なる関数であるため、いくつかの違いがあるはずです。
それらの違いは何ですか?
回答:
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
必要があるようです。不要と思われ、ユーザーを混乱させるだけです。
すでに述べた違いに加えて、今私が今困難な方法で発見したもう1つの非常に重要な違いがあります:とは異なり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
を適宜使用します。