我在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)]
我犯了什么错误? 非常感谢您的帮助。
答案 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