2016-04-09 12 views
6

タイムスタンプの配列があり、行列Xの2番目の列の各行が増加しています。タイムスタンプの平均値が計算され、最大値よりも大きくなります。私はストレージのためにnumpyのmemmapを使用しています。なぜこうなった?numpy meanがmemmapのmaxより大きい

>>> self.X[:,1] 
memmap([ 1.45160858e+09, 1.45160858e+09, 1.45160858e+09, ..., 
    1.45997146e+09, 1.45997683e+09, 1.45997939e+09], dtype=float32) 
>>> np.mean(self.X[:,1]) 
1.4642646e+09 
>>> np.max(self.X[:,1]) 
memmap(1459979392.0, dtype=float32) 
>>> np.average(self.X[:,1]) 
1.4642646e+09 
>>> self.X[:,1].shape 
(873608,) 
>>> np.sum(self.X[:,1]) 
memmap(1279193195216896.0, dtype=float32) 
>>> np.sum(self.X[:,1])/self.X[:,1].shape[0] 
memmap(1464264515.9120522) 

EDIT: ここにmemmapファイルをアップロードしました。 http://www.filedropper.com/x_2これはロード方法です。

filepath = ... 
shape = (875422, 23) 
X = np.memmap(filepath, dtype="float32", mode="r", shape=shape) 

# I preprocess X by removing rows with all 0s 
# note this step doesn't affect the problem 
to_remove = np.where(np.all(X == 0, axis=1))[0] 
X = np.delete(X, to_remove, axis=0) 
+0

は、行動の変化をい'self.X [:, 1]'の? – user2357112

+0

@ user2357112いいえ、まだ間違った平均を返します – siamii

+0

@siamii:アキュムレータの問題です。このような大きな配列にはfloat64アキュムレータを使用する必要があります。詳細については、答えを確認してください。 – Vasanth

答えて

6

これはnumpyやmemmapの問題ではありません。浮動小数点の問題は、正確にはfloat32です。同じエラーがC++のような他の言語で起こっているのを見ることができます。

アキュムレータは、ますます多くの番号が追加されるにつれて不正確になります。

In [26]: a = np.ones((1024,1024), dtype=np.float32)*4567 

In [27]: a.min() 
Out[27]: 4567.0 

In [28]: a.max() 
Out[28]: 4567.0 

In [29]: a.mean() 
Out[29]: 4596.5264 

これは、np.float64タイプで発生しません(より多くの呼吸室を与えます)。

In [30]: a = np.ones((1024,1024), dtype=np.float64)*4567 

In [31]: a.min() 
Out[31]: 4567.0 

In [32]: a.mean() 
Out[32]: 4567.0 

あなたは明示的に指定することにより、float64バッファを使用するようにmean()を作ることができます。あなたは([:, 1] self.X) `代わり代わりに` self.X`、または `np.arrayの` np.array(self.X) `でそれをテストする場合

In [12]: a = np.ones((1024,1024), dtype=np.float32)*4567 

In [13]: a.mean(dtype=np.float64) 
Out[13]: 4567.0 
+0

平均でdtypeを指定すると、メモリ内にfloat64(またはO(1))float64が割り当てられるだけですか、それとも配列全体がキャストされますか?私は前者を仮定しますが、好奇心が強いだけです。 – Paul

+0

これは、計算に使用されるアキュムレータのデータ型です。新しい 'float64'配列を割り当てません。 – Vasanth

+0

@Vasanthなぜこのようなことが起きるのか詳細な回答ができますか? –

関連する問題