数组运算结果在交互和程序之间有所不同

时间:2014-12-18 23:18:20

标签: python arrays numpy operation

  

我在iPython中以交互方式比较两个数组,返回值是   正确的:

     

在[143]中:r = np.array([0.,0.04166667,0.08333333,0.125,0.16666667,   0.20833333,0.25,0.29166667,0.33333333,0.375,0.41666667,0.45833333,0.5,0.56166667,0.58333333,0.625,0.666666667,0.70833333,0.75,0.77166667,0.83333333,0.875,0.91666667,0.95533333])

In[144]: c=np.array([ 0., 0.04166667, 0., 0., 0., 0.20833333, 0., 0.29166667 , 0., 0.  , 0., 0.45833333, 0.,        0.54166667, 0. , 0. , 0.,0.70833333, 0. , 0.79166667 , 0., 0., 0., 0.95833333])

In [145]: c==r

Out[145]: 
array([ True,  True, False, False, False,  True, False,  True, False,
       False, False,  True, False,  True, False, False, False,  True,
       False,  True, False, False, False,  True], dtype=bool

但是在同一个'中的python程序中。设置,结果不正确:

turns=1

r = np.linspace(1/24, turns, 24*turns,endpoint=False)

rr=r%1 

c=np.array([0.,0.04166667,0,0,0,0.20833333,0,0.29166667,0,0,0,0.45833333,
0,0.54166667,0,0,0,0.70833333,0,0.79166667,0,0,0,0.95833333])

cc=np.tile(c,turns)

print([rr==cc])

结果不同:

[array([ True, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False], dtype=bool)]

我犯了什么错误? 非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这是浮点精度的问题;你的第一和第二个案件确实不一样Floating Point guide是一个有用的资源。

在第一个实例中,您将从浮点文字填充两个数组,然后直接比较它们。在第二个中,你使用 numpy函数的输出并直接将它与仍然从文字创建的第二个数组进行比较。

即使函数输出的显示版本看起来相同,但实际数字的精确度要高于此值,这足以剔除==比较;你应该(几乎)从不在第一时间使用浮点数的相等比较。

一个简单的例子:

>> print 0.1 + 0.2
0.3
>> 0.1 + 0.2
0.30000000000000004

答案 1 :(得分:1)

回答这是一个浮点问题。一种解决方案是使用np.isclose

In [11]: np.isclose(rr, cc)
Out[11]:
array([ True,  True, False, False, False,  True, False,  True, False,
       False, False,  True, False,  True, False, False, False,  True,
       False,  True, False, False, False,  True], dtype=bool)

检查值是否在彼此的atol范围内(默认为1e-8):

In [12]: cc[1]
Out[12]: 0.041666670000000003

In [13]: rr[1]
Out[13]: 0.041666666666666664

In [14]: cc[1] == rr[1]
Out[14]: False

In [15]: rr[1] + 1e-8 > cc[1]
Out[15]: True