【问题标题】:Printing numpy array in python在python中打印numpy数组
【发布时间】:2017-03-17 12:36:08
【问题描述】:

这是一个简单的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 等等......为什么这些输出不同?

【问题讨论】:

    标签: python numpy printing


    【解决方案1】:

    这是因为浮点错误。运行这个:

    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

    【讨论】:

    • 是的,你可以试试int(10*(0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)),它会给出7而不是8。使用round()而不是int()来解决问题。
    • 谢谢,我已将其纳入我的回答中。
    【解决方案2】:

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

    如果你看int()definition

    If x is floating point, the conversion truncates towards zero
    

    要解决您的问题,请使用 round() 而不是 int()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-15
      • 2021-01-04
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多