2017-01-25 4 views
1

numpy.mean()numpy.var()の出力は、引数の順序が変わると変化することがわかりました。numpyの順序は依存していますか?

浮動小数点数の精度だけで済むか、何か不足していますか?ここ

import numpy 

l1 = [1.0, 0.69, 0.65, 0.7, 0.64, 0.8] 
l2 = [1.0, 0.7, 0.69, 0.65, 0.64, 0.8] 

assert sorted(l1) == sorted(l2) 

print repr(numpy.mean(l1)) 
print repr(numpy.mean(l2)) 

print repr(numpy.var(l1)) 
print repr(numpy.var(l2)) 

Iが得出力:(この場合)

0.7466666666666667 
0.74666666666666659 
0.015522222222222222 
0.015522222222222224 
+0

浮動小数点加算は可換ではなく、連想ではないので、ほかの順序が重要です。より極端な例として、 'l1 = [1e17,3.0、-1e17]'と 'l2 = [1e17、-1e17,3.0]を試してください。 (ちなみに、これらの2つの結果は、MikeMüllerが言及した 'allclose'テストでは失敗します。) –

答えて

3

numpyの用途を64ビットの浮動小数点。 Floating point numbersは、すべての数値を無制限の精度で表すことはできません。 このデータ型は15桁の有効数字を保持できます。これは、あなたの番号の最後の桁が無意味であることを意味します。 したがって、私たちの数字はnumpy.allcloseを使用し比較するには:

>>> numpy.allclose(numpy.mean(l1), numpy.mean(l2)) 
True 
関連する問題