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