I compare two arrays interactively in iPython, the returns are correct:
In[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.54166667, 0.58333333 , 0.625, 0.66666667 , 0.70833333 , 0.75, 0.79166667, 0.83333333, 0.875, 0.91666667, 0.95833333])
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)]
我犯了什么错误? 感谢您的帮助。
最佳答案
这是浮点精度的问题;你的第一个和第二个案例确实不一样。 Floating Point guide是这里有用的资源。
在第一个实例中,您从浮点文字填充两个数组,然后直接比较它们。在第二个中,您使用 numpy 函数的输出,并直接将其与仍由文字创建的第二个数组进行比较。
尽管函数输出的显示版本看起来相同,但实际数字的精度比这更高,这足以摆脱 ==
比较;你不应该(几乎)从一开始就对 float 使用相等比较。
一个简单的例子:
>> print 0.1 + 0.2
0.3
>> 0.1 + 0.2
0.30000000000000004
关于python - 交互式和程序之间的数组运算结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27557406/