0

我是 Python 的初学者,我确实理解在这种情况下出了什么问题,SetVel[i+4]超出了范围。但我无法纠正它。任何帮助都会很棒。这是我的代码:

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在条件起作用以消除错误之后,但代码仅运行该块一次。仅附加一个索引

4

2 回答 2

1

您正在迭代使用i它之前的最大值length-3,在length-4(实际上等于len(SetVel)-4.

按照这个逻辑,如果i = len(SetVel)-4thenSetVel[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在它的末尾循环,无条件地,你只会得到它的一次迭代(只有一个结果),所以不要那样做

于 2017-07-30T19:45:21.293 回答
0

使用索引结果而不是命名变量,高度正则的数学表达式可能更清晰,
Python 真的很喜欢使用迭代器

一旦你习惯于列出理解,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)])]
于 2017-07-30T20:36:52.910 回答