在python中打印numpy数组

时间:2017-03-17 12:36:09

标签: python numpy printing

这是python中的一个简单代码。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

正如@Denziloe所指出的,这是由于浮点错误造成的。

如果您查看int()的{​​{3}}:

If x is floating point, the conversion truncates towards zero

要解决您的问题,请使用round()代替int()