问题描述
我想做这家伙所做的:
但是我需要对其进行优化以使其运行速度超快.简而言之,我想记录一个时间序列,并在它每次越过零(改变符号)时告诉它.我想记录零交叉之间的时间.由于这是真实数据(32 位浮点数),我怀疑每个人都会有一个恰好为零的数字,因此这并不重要.我目前有一个计时计划,所以我会为你的结果计时,看看谁赢了.
However I need to optimize it to run super fast. In brief I want to take a time series and tell every time it crosses crosses zero (changes sign). I want to record the time in between zero crossings. Since this is real data (32 bit float) I doubt I'll every have a number which is exactly zero, so that is not important. I currently have a timing program in place so I'll time your results to see who wins.
我的解决方案给出(微秒):
My solution gives (micro seconds):
open data 8384
sign data 8123
zcd data 415466
如您所见,过零检测器是缓慢的部分.这是我的代码.
As you can see the zero-crossing detector is the slow part. Here's my code.
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,' ',(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 将包含元素的索引 before 发生零交叉.如果您想要之后的元素,只需在该数组中添加 1.
I.e., zero_crossings will contain the indices of elements before which a zero crossing occurs. If you want the elements after, just add 1 to that array.
这篇关于有效检测python中的符号变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!