我想做的正是这个家伙所做的:
Python-计算符号变化
但是,我需要对其进行优化以使其超快运行。简而言之,我想采用一个时间序列,并告诉它每次穿越时都越过零(更改符号)。我想记录两次过零之间的时间。由于这是真实数据(32位浮点数),我怀疑我每个人都有一个正好为零的数字,所以这并不重要。我目前有一个计时程序,所以我将为您的成绩计时,以查看谁获胜。
我的解决方案给出了(微秒):
open data 8384 sign data 8123 zcd data 415466
如您所见,过零检测器是最慢的部分。这是我的代码。
import numpy, datetime class timer(): def __init__(self): self.t0 = datetime.datetime.now() self.t = datetime.datetime.now() def __call__(self,text='unknown'): print text,'\t',(datetime.datetime.now()-self.t).microseconds self.t=datetime.datetime.now() def zcd(data,t): sign_array=numpy.sign(data) t('sign data') out=[] current = sign_array[0] count=0 for i in sign_array[1:]: if i!=current: out.append(count) current=i count=0 else: count+=1 t('zcd data') return out def main(): t = timer() data = numpy.fromfile('deci.dat',dtype=numpy.float32) t('open data') zcd(data,t) if __name__=='__main__': main()
关于什么:
import numpy a = [1, 2, 1, 1, -3, -4, 7, 8, 9, 10, -2, 1, -3, 5, 6, 7, -10] zero_crossings = numpy.where(numpy.diff(numpy.sign(a)))[0]
输出:
> zero_crossings array([ 3, 5, 9, 10, 11, 12, 15])
即,zero_crossings将包含 在 其 之前 发生零交叉的元素的索引。如果要在 之后 的元素,只需将1添加到该数组。