Ответ Джима Бриссома терпит неудачу, если a содержит значение 0:
import numpy
a2 = [1, 2, 1, 1, 0, -3, -4, 7, 8, 9, 10, -2, 1, -3, 5, 6, 7, -10]
zero_crossings2 = numpy.where(numpy.diff(numpy.sign(a2)))[0]
print zero_crossings2
print len(zero_crossings2) # should be 7
Выход:
[ 3 4 6 10 11 12 13 16]
8
Число пересечений нуля должно быть 7, но поскольку sign () возвращает 0, если передано 0, 1 для положительных значений и -1 для отрицательных значений, diff () будет считать переход, содержащий ноль, дважды.
Альтернативой может быть:
a3 = [1, 2, 1, 1, 0, -3, -4, 7, 8, 9, 10, 0, -2, 0, 0, 1, 0, -3, 0, 5, 6, 7, -10]
s3= numpy.sign(a3)
s3[s3==0] = -1 # replace zeros with -1
zero_crossings3 = numpy.where(numpy.diff(s3))[0]
print s3
print zero_crossings3
print len(zero_crossings3) # should be 7
, которые дают правильный ответ:
[ 3 6 10 14 15 18 21]
7