我是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
,但代码仅运行块一次。只附加一个索引
答案 0 :(得分:1)
您正在使用i
进行迭代,length-3
位于length-4
之前,len(SetVel)-4
(实际上等于i = len(SetVel)-4
。
遵循此逻辑,如果SetVel[i+4]
,则SetVel[len(SetVel)-4+4]
等于SetVel[len(SetVel)]
或for i in range(2, length-3):
。
所有这一切只是为了向您展示错误的原因 - 您正在寻找一个长度本身的索引。这不会很好,因为索引从0开始而不是1.可能的最高索引是从长度开始的-1。
换句话说,替换
for i in range(2, length-4):
使用
break
最后,如果你<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.designer.cs" Inherits="HelloWorlds.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="item1" runat="server"> </asp:TextBox>
</div>
</form>
</body>
</html>
循环结束,无条件地,你只得到它的一次迭代(只有一个结果),所以不要那样做
答案 1 :(得分: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)])]