1

完全にマスクされたマスク配列で加重平均を計算すると、weights=Noneorに対して異なる結果が得られweights=1ます。

import numpy.ma as ma
a = ma.arange(2.)
a[:] = ma.masked                             # fully masked
ma.average(a)                                # returns NaN, which is ok since all elements are masked
ma.average(a, weights=None,  returned=True)  # returns (NaN, 0.0), which is ok also
ma.average(a, weights=(1,1), returned=True)  # returns 'masked'

最後の 2 行は同じ結果、つまり、同じ数の出力と同じ値が得られると思いますが、そうではありません。最も厄介なことに、最後のケースでは、2 番目の出力引数を取得しようとしたときにエラーが発生します。これらの結果が得られるのはなぜですか?

4

1 に答える 1

2

この動作が煩わしいことには同意しますが、それnumpy.ma.averageはコード化された方法にすぎません。そのソース コードを見ると、505 行目あたりで if 句の実行が異なるかどうかが異なることがわかりweights=Noneます。

weights != None操作の結果、中間生成物の 1 つがマスクされた配列になる場合。コードの後半 (562 行目) で、これらの中間配列内のマスクされた配列のチェックがあり、true の場合、出力は常にマスクされます。それ以外の場合weights == Noneは aNaNがスローされるため、それが出力になります。

この不一致は、配列のすべての要素がマスクされている場合にのみ発生するようです。実際の例では、重みをNoneまたは均一な配列に設定すると、同じ結果が得られます。

于 2012-12-11T09:58:59.397 に答える