Python NumPyのnp​​.mean()とnp.average()?


189

それに気づく

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

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

ただし、やはり2つの異なる関数であるため、いくつかの違いがあるはずです。

それらの違いは何ですか?


20
実際、私が見る限り、ドキュメントではすぐにはわかりません。言うことは不可能ではありませんが、この質問はスタックオーバーフローにも当てはまります。
BlackVegetable 2013年

1
numpy.mean:配列要素の平均を返します。
joaquin 2013年

@joaquin:「指定された軸に沿って算術平均を計算します。」vs「指定された軸に沿って加重平均を計算します。」?
Blender 2013年

@ブレンダー右。私はちょうどあなたのコメントに一種の面白い応答を作ろうとしていたので、私があなたの指示に従った場合、私がnumpy.meanのドキュメントで最初に読んだのはnumpy.meanです:あなたが面白いなら、配列要素の平均を返します OPの質問に対する答えを探しています。
joaquin 2013年

回答:


180

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

59
なぜ2つの異なる機能を提供するのですか?すでにオプションであるnp.averageため、提供するweights必要があるようです。不要と思われ、ユーザーを混乱させるだけです。
Geoff

6
@Geoff私は、算術平均が「平均」と同一ではないことをユーザーに知らせるために、「平均」に対してNotImplementedExceptionをスローしてもらいたいです。
FooBar

26

np.mean 常に算術平均を計算し、入力と出力のいくつかの追加オプションがあります(たとえば、使用するデータ型、結果の配置場所)。

np.averageweightsパラメータが指定されている場合、加重平均を計算できます。


24

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

すでに述べた違いに加えて、今私が今困難な方法で発見したもう1つの非常に重要な違いがあります:とは異なりnp.mean、キーワードをnp.average許可しませんdtypeh5ファイルからアクセスされる非常に大きな単精度配列があります。軸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.