2017-03-17 104 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) 

,你會看到,alpha是,依次爲:

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點號碼在您的計算機上存儲不精確。如果你把0.1加在一起說8次,你不一定會得到0.8 - 小的錯誤可以積累,並給你一個不同的數字,在這種情況下,0.7999999999999999。 Numpy數組必須使用整數作爲索引,所以它使用int函數強制將其舍入到最接近的整數--7,這會導致該行被覆蓋。

爲了解決這個問題,你必須重寫你的代碼,以便你只能使用整數索引到數組中。一個稍微粗糙的方法是使用round函數將浮點四捨五入到最接近的整數。但是你真的應該重寫你的代碼,以便它遍歷整數並將它們轉換爲浮點數,而不是遍歷浮點數並將它們轉換爲整數。

您可以在此處詳細瞭解浮點數:

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

+0

是的,你可以試試'INT(10 *(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1))',它會得到7而不是8.使用'round()'而不是'int()'來解決這個問題。 –

+0

謝謝,我已經將其納入我的答案。 – Denziloe

1

由於@Denziloe指出,這是由於浮點錯誤。

如果你看一下int()definition

If x is floating point, the conversion truncates towards zero 

解決你的問題使用round()代替int()