在Python中计算列表中的零交叉数

时间:2018-09-27 00:27:36

标签: python

我正在尝试在列表中找到零交叉的数量。我正在使用的代码是:

for i in range(1, len(value)):
    zerocrossing = 0
    if ((value[i-1]) > 0 and value[i] < 0):
        zerocrossing += 1
    if ((value[i-1]) < 0 and value[i] > 0):
        zerocrossing += 1
stdio.writeln('The Number of Zero Crossings is ' + str(zerocrossing))

此代码不会给我任何错误,但不能给我正确的答案。如果我给它输入[1.0, -1.0, 1.0],它给我1,但它应该给2。我在做什么错了?

3 个答案:

答案 0 :(得分:1)

您要在每次循环迭代中将zerocrossing设置为零。将zerocrossing = 0移到for循环之外。

答案 1 :(得分:1)

l = [1.0, -1.0, 1.0]

zero_x = 0

for idx, item in enumerate(l[:-1]):
    if l[idx] < 0 and l[idx+1] > 0:
        zero_x +=1
    if l[idx] > 0 and l[idx+1] < 0:
        zero_x +=1
2

答案 2 :(得分:0)

正如其他人已经确定的那样,您的直接问题是要在循环内初始化计数器,从而导致每次迭代将其重置为零。

该评论在另一个答案中提出,该算法不考虑包含一个或多个零的列表。如果出于某种原因您不想过滤列表,则可以通过过滤或以下类似方法来解决。

我对python有点生疏,所以可能会有更多的pythonic方法来实现这一目标。

l = [1.0, 0.0, -1.0,0.0, 0.0, 1.0]

def zero_x(l):
    x =0       #Count
    s0=0; s1=0 #This and next sign
    sign = lambda a: (a>0) - (a<0)  
    cross = lambda a,b,lim: (s0 !=lim and s1!=lim and s0 !=s1)

    for idx, item in enumerate(l[:-1]):
        s0=s0 if l[idx]==0 else sign(l[idx])  #Keep previous sign if zero
        s1=sign(l[idx+1])
        x+=cross(s0,s1,0)

    return x

print(zero_x(l))