2016-11-25 3 views
2

私は、次の値が有限である間にnumpy.meanが無限になるのはなぜですか?

>>> x = np.array([8.988465674311579e+307, 8.98846567431158e+307]) 
>>> x 
array([ 8.98846567e+307, 8.98846567e+307]) 
>>> x.mean() 
inf 

に出くわしたときの要素の合計がinfあるので、これは発生しますか?仮説で遊んでましたか

>>> x.sum() 
inf 

もしそうなら、なぜnumpyが最初に分割されないのですか?

>>> (x/len(x)).sum() 
8.9884656743115795e+307 
+1

最初に分割して後で加算すると、複雑さは配列サイズの要素によって増加すると思います。 – ayhan

+0

私は問題はその部門が高価だと思います。おそらく、この状況を検出し、適切な方法を選択することは可能でしょうか? – Marein

+0

これは基本的に問題と潜在的な解決策を診断しているので、numpyに対して提出された問題として、より良い結果をもたらすかもしれません。 – Eric

答えて

2

x.mean組み込みであるので、私はそれがコード化されています正確にどのように確認するためにgithubのを見ていると思います。しかし、ストレートフォワードの後ろに分裂が続く可能性が最も高い。しかし、それは軸やdtypeのようなバリエーションを処理します。

私の推測では、あなたのケースは特別な治療を受けるには十分頻繁に上がらないということです。サイズによって定期的に除算することは、精度の低下につながる可能性があるため、良い考えではありません。そして、それは配列を通して余分な反復を必要とします。代わりに、合計を実行して、infまたはoverflowの値があるかどうかを確認し、スケーリングされた値でタスクを繰り返します。それも余分な反復を招く。

しかし、ユーザーは常に値を適切に拡大縮小することができます。あなた自身のmeanをスケーリングした後、合計でコーディングするのは簡単です。このinfの問題をmeanと打つと、それらの数値の合計(加重平均、ドット、標準など)を含む他の計算ではおそらくヒットします。したがって、各計算が行うと予想するのではなく、それはあなたのためです。

Why does "numpy.mean" return 'inf'? は、意図的にdtypeを制限している場合(たとえばdtype=np.float16)に問題が発生する可能性が高いことを示しています。

In [361]: x=np.array([6550]*1000,dtype=np.float16) 
In [362]: x.mean() 
Out[362]: inf 
In [363]: x.mean(dtype=float) 
Out[363]: 6552.0 

np.meanドキュメントはdtypeの選択と精度の潜在的な損失について話しています。彼らはあまりにもオーバーフローの問題に言及することができます。

+0

私の解決策がもたらす余分な繰り返し/複雑さについて、何人かのユーザーが言及していますが、これが本当であるかどうかはわかりません。この実装を取る: 'mean = 0; xのiについて:mean + = i/len(x) '。まだ 'O(len(x))'です。 – Marein

0

ちょうどnumpyの問題ページにコメントしましたが、私もここに投稿したいと思いました。

次のように速くnumpy.meanが大きなフレンドリーな方法で計算したかのように、一般性を失うことなく、一般的に働く、とすべきである:

def my_mean(x): 
    return np.average(x, weights=np.ones_like(x)/x.size) 

あなたがnp.meanを考え解決したいの道をあらかじめ1/n倍しておくこと - 一般性を失うことなく、np.averageで重み付けを行うことができます。

また、(x/len(x)).sum()を実行することもできますが、上記のように重みの丸めを処理する方が良いと思います。

関連する問題