2011-12-22 10 views
8

私はpythonとnumpyに新しいので、この問題が非常に初歩的であれば私を許してください! Iが負の値の配列を有している(ソートされ):Pythonのlong(> 20millionの要素)配列の合計numpy

Iは、分布の標準偏差を見つけるために、その重複した(ただし、正の値を有する)にこの配列を追加する必要が
>>>neg 
[ -1.53507843e+02 -1.53200012e+02 -1.43161987e+02 ..., -6.37326136e-1 -3.97518490e-10 -3.73480691e-10] 
>>>neg.shape 
(12922508,) 

がゼロに平均化されます。だから私は、次の操作を行います。

>>>pos=-1*neg 
>>>pos=pos[::-1] #Just to make it look symmetric for the display bellow! 
>>>total=np.hstack((neg,pos)) 
>>>total 
[-153.50784302 -153.20001221 -143.1619873 ..., 143.1619873 153.20001221 153.50784302] 
>>>total.shape 
(25845016,) 

これまでのところ、すべてが非常に良いですが、奇妙なことは、この新しい配列の和がゼロではないということです。

>>>numpy.sum(total) 
11610.6 

標準偏差はでもありませんすべて私が期待していたものに近いが、私はその問題の根本がこれと同じであると推測する。なぜ合計がゼロにならないのか?

このメソッドを小さな配列に適用すると、例えば[-5、-3、-2]の場合、合計はゼロになります。だから私は問題は配列の長さにあると思う(20million以上の要素)。この問題に対処する方法はありますか?

私がこれに助けてくれる人がいれば、私は最も感謝しています。

+2

'math.fsum(total)'は '0'を返しますか? – jfs

+0

はい、あります!ワオ!!!あなたはnumpyを一切使用してはならないということを意味しています。私はnumpyが配列作業に最適なツールだと誤解していました!!!しかし、http://docs.python.org/py3k/library/math.html#module-mathを見ると、標準偏差を計算するためのツールはありません。あなたは何を提案しますか? – makhlaghi

+0

いいえ 'fsum()'は、あなたのコードが集計中に精度を失うこと以外のいくつかのバグを持っていないという健全性チェックのためのものです。標準偏差については、['numpy.std()'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html)を使用することができます。 'np.std(total、dtype = np.float64)'を試してください。 – jfs

答えて

3

コメントに記載されているように、何百万という等号番号の合計から浮動小数点数の問題が発生します。これを回避する1つの可能な方法は、合算しながら、常に同じオーダー内おおよそとどまる任意の中間結果となるよう、組み合わせのアレイに正と負の数を混在させることができます。今すぐ

neg = -100*numpy.random.rand(20e6) 
pos = -neg 
combined = numpy.zeros(len(neg)+len(pos)) 
combined[::2] = neg 
combined[1::2] = pos 

combined.sum()はにかなり近いはずゼロ。おそらくこのアプローチは、標準偏差の計算における精度を向上させるのにも役立つであろう。

+0

合計は今やちょうどゼロになりました。平均もゼロではありませんでした。非常に奇妙なことは、標準偏差が以前と変わっていないということです。 numpy.sum()とnumpy.mean()の間に 'numpy.std()'が他のメソッドを使って(例えば 'math.fsum()'モジュールで)合計を計算しない限り、 '変更されました、' numpy.std() 'did not !!!! – makhlaghi

+1

数式の集計を行うために説明した手法を使用して、 'std()'を自分で実装する必要があります。 –

+0

私は自分の 'std()'を計算するプログラムを書いた。各値の差を10,000要素のパッケージの平均値で求め、結果を合計し、最後に要素数で除算して平方根を求めます。すべての> 25millionの要素の標準偏差を計算するのに約15分かかり、正確に 'numpy.std()'と同じ値を見つけました(それは数分の1秒かかりました!)。このデータセットは私のアルゴリズムのテストでした:私が言ったように私は最初から標準偏差を知っていました。その標準偏差の出所を調べて、それが正しいかどうかを確認します。 – makhlaghi

関連する問題