如何删除for循环的'索引超出范围'错误?
我是一个Python初学者,我确实明白在这种情况下有什么不对,SetVel[i+4]
超出了范围。但我无法纠正它。任何帮助将是惊人的。这里是我的代码:如何删除for循环的'索引超出范围'错误?
OutSmooth = []
IndexOut = []
IndSmooth = []
length = len(SetVel)
for i in range(2, length-3):
diffnext = (SetVel[i+4])- (SetVel[i+3])
diffprev = (SetVel[i+1])-(SetVel[i])
diff1 = SetVel[i+2]-SetVel[i+1]
diff2 = SetVel[i+3]-SetVel[i+2]
if diff1 < 1.5*diffprev or diff2 < 1.5*diffnext:
IndSmooth.append(SetVel.index(SetVel[i+2]))
else:
OutSmooth.append(SetVel[i+2])
PS:对于那些问这是什么居然是:这是我的非衍生曲线平滑的尝试。在我的主程序中,我确实有一个基于NumPy的衍生曲线平滑机制,但是我已经完成了这个工作,这是为了我的理解和备份。由于
编辑:
break
后病情一道努力消除错误,但代码只有一次运行该块。只有一个指数附加
您正在使用i
,只是length-3
之前马克塞斯,在length-4
(这INFACT等于len(SetVel)-4
迭代。
按照这样的逻辑,如果i = len(SetVel)-4
然后SetVel[i+4]
等于SetVel[len(SetVel)-4+4]
,或SetVel[len(SetVel)]
所有这些只是为了告诉你错误的原因 - 你正在寻找一个索引本身的长度,这不会是好的,因为索引从0开始而不是1。 -1从长度。
换句话说,更换
for i in range(2, length-3):
随着
for i in range(2, length-4):
最后,如果你break
循环在它的结束,无条件的,你得到它只有一个迭代(只有一个结果),所以只是不这样做
高度规则的数学表达式可能更清晰,索引结果而不是命名变量
和Pytho ñ真的喜欢消费的迭代器
,一旦你用来列出内涵,zip()
我想生成的差异文件,名单可能会更清晰
SetVel = [math.sin(math.pi*(n % 10 - 5)/5) for n in range(20)]
diffs = [[ e1 - e0, e2 - e1, e3 - e2, e4 - e3 ]
for e0, e1, e2, e3, e4
in zip(SetVel,
SetVel[1:],
SetVel[2:],
SetVel[3:],
SetVel[4:])]
OutSmooth = []
IndSmooth = []
delta = 1.5 # may want to change the constant, do it one place
for i, d in enumerate(diffs):
if d[1] < delta*d[0] or d[2] < delta*d[3]:
IndSmooth.append(i+2) # a guess at what you really wanted
else:
OutSmooth.append(SetVel[i+2])
IndSmooth
Out[64]: [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17]
OutSmooth
Out[65]: [0.0, 0.0]
一个常见的编程目标是参数化,自动化,所以这里输入的是您需要的差异数量,其余部分是自动的
n_diff = 4
diffs = [[g - f for f, g in zip(e, e[1:])]
for e in zip(*[SetVel[n:]
for n in range(n_diff+1)])]
哇..这很有道理!谢谢! –
upvotes是首选的Stack Exchange反馈,即使它不直接回答你的问题,请记住当你有15个声望点时 – f5r5e5d
您的range()转到了'length-3',所以'i + 4'会超出'SetVel'的长度。 – AChampion
是的,我明白错误的原因,所以解决方案将它限制为[i]而不是集合中增加的元素? –
现在的问题是,它只打印一个元素作为答案,因为休息,这绝对不是真的 –