2017-03-17 16 views
1

ここにpythonで簡単なコードがあります。Pythonでnumpy配列を出力する

end = np.zeros((11,2)) 
alpha=0 
while(alpha<=1): 
    end[int(10*alpha)] = alpha 
    print(end[int(10*alpha)]) 
    alpha+=0.1 
print('') 
print(end) 

と出力:

[ 0. 0.] 
[ 0.1 0.1] 
[ 0.2 0.2] 
[ 0.3 0.3] 
[ 0.4 0.4] 
[ 0.5 0.5] 
[ 0.6 0.6] 
[ 0.7 0.7] 
[ 0.8 0.8] 
[ 0.9 0.9] 
[ 1. 1.] 

[[ 0. 0. ] 
[ 0.1 0.1] 
[ 0.2 0.2] 
[ 0.3 0.3] 
[ 0.4 0.4] 
[ 0.5 0.5] 
[ 0.6 0.6] 
[ 0.8 0.8] 
[ 0. 0. ] 
[ 1. 1. ] 
[ 0. 0. ]] 

0.7が欠落していることに気づくのは簡単ですし、0.8の後は0ではなく0.9になるなど...なぜ、これらの出力が異なっていますか?

答えて

2

浮動小数点エラーが原因です。この実行します。

import numpy as np 

end = np.zeros((11, 2)) 
alpha=0 
while(alpha<=1): 
    print("alpha is ", alpha) 
    end[int(10*alpha)] = alpha 
    print(end[int(10*alpha)]) 
    alpha+=0.1 
print('') 
print(end) 

を、あなたはそのアルファが表示されます、順次、されています。基本的には0.1のような浮動小数点数は不正確コンピュータ上に保存されている

alpha is 0 
alpha is 0.1 
alpha is 0.2 
alpha is 0.30000000000000004 
alpha is 0.4 
alpha is 0.5 
alpha is 0.6 
alpha is 0.7 
alpha is 0.7999999999999999 
alpha is 0.8999999999999999 
alpha is 0.9999999999999999 

。 0.1を合計して8倍と言うと、必ず0.8になるわけではありません。小さな誤差が累積して別の数になります。この場合、0.7999999999999999です。ナンディ配列はインデックスとして整数を取らなければならないので、int関数を使用して、この行を最も近い整数-7に切り捨てるようにして、その行を上書きします。

これを解決するには、配列にインデックスを付けるために整数だけを使用するようにコードを書き直す必要があります。 1つのやや粗い方法は、round関数を使用してフロートを最も近い整数に丸めることです。しかし実際には、整数を反復し、浮動小数点数を繰り返して整数に変換するのではなく、浮動小数点数に変換するようにコードを書き直すべきです。

あなたはここに浮動小数点数についての詳細を読むことができます:

https://docs.python.org/3/tutorial/floatingpoint.html

+0

の問題の使用round()を解決するために

If x is floating point, the conversion truncates towards zero 

はい、あなたは( 'int型を試すことができます10 *(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1)) 'を返し、8の代わりに7を返します。問題を解決するには' int() 'の代わりに' round() 'を使用します。 –

+0

ありがとう、私はそれを私の答えに取り入れました。 – Denziloe

1

@Denziloeが指摘したように、これはポイントエラーを浮動によるものです。

あなたがint()definitionを見れば:代わりにint()

関連する問題