我希望搜索我的数组[1,2,3,4,5]代表秒并检查我的时间变量't'(最初为0)是否与范围项匹配,此时我想要打印时间'只'一次。
循环将再次被读取,但这次不打印任何东西,除非找到另一个匹配 - 即。 t现在是2秒,所以当t = 2时,打印't'ONCE。
我如何在Python中实现这一目标?这就是我目前所拥有的:
t = 0
dt = 0.05
a = np.arange(1,5,1)
while t < 10:
for x in range(a.size):
if int(t) == a[x,0]:
print "TIME IS NOW >>>>>>>", int(t)
t = t+dt
这是有效的,除非它一次又一次地打印先前匹配的号码,直到找到新的匹配号码:
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>2
TIME IS NOW >>>>>>>2
依旧.....
我想要一个结果:
TIME IS NOW >>>>>>>1
-
-(looping but no print out)
TIME IS NOW >>>>>>>2
-
and so on...
答案 0 :(得分:0)
你在这里处理浮点数,当你在其中一个中调用int
时,得到的是该数字的最低点,即浮点数X.yyyy
得到{ {1}}无论X
如何,例如
yyyy
所以你得到一堆0,然后是一堆1,依此类推......
那么如何比较数字? 0.05 -> 0
0.55 -> 0
0.95 -> 0
1.25 -> 1
etc.
由于floats的精确问题总是很烦人但是有一个解决方法,而且检查某个边界内的数字有多近,检查很简单<{1}} / p>
==
您选择最方便的epsilon,例如abs(a-b) <= epsilon
或1e-10
,然后最终产品
1e-16
,输出
t = 0
dt = 0.05
check_point = range(1,6)
while t<10:
if any( abs(t-x) <= 1e-10 for x in check_point ):
print "TIME IS NOW >>>>>>>", t
t += dt
答案 1 :(得分:0)
这两段代码都会起作用,虽然我仍然不知所措,为什么你希望以这种方式这样做。
此版本处理浮点数到数组中的2位小数
import numpy as np
a = np.arange(1,5,1)
t=0
while t < 10:
if int(t) in np.unique(a): #set(a) would work here too
print "TIME IS NOW >>>>>>>", int(t)
t=int(t)+1 #increment to next integer
t+=0.05
这个只会处理整数值
{{1}}
答案 2 :(得分:0)
非常感谢答案,特别是'科波菲尔' - 你的epsilon边界检查让我找到更多关于浮点数的问题,虽然你的解决方案不能直接对我起作用我找到了一个使用Numpy的命令(因为我的数组是一个Numpy数组) - 'isclose'命令。这似乎可以解决您的解决方案所做的工作,并使用容差检查列表项以进行比较。
我的问题的正确解决方案是:
if np.isclose(insRate, t, atol=0.0001).any():
print "TIME IS NOW >>>>>>>", t
再次感谢大家!