python - 有效检测python中的符号变化

标签 python math performance numpy

我想做这家伙所做的事情:

Python - count sign changes

但是我需要优化它以超快运行。简而言之,我想采取一个时间序列并告诉它每次越过零(更改符号)。我想记录过零之间的时间。由于这是真实数据(32 位 float ),我怀疑我每个人都会有一个正好为零的数字,所以这并不重要。我目前有一个计时计划,所以我会为你的结果计时,看看谁赢了。

我的解决方案给出(微秒):

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 将包含元素的索引 before 发生过零。如果你想要元素之后,只需在那个数组中加1。

关于python - 有效检测python中的符号变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843017/

相关文章:

有序组合算法

php - 'clean code' 的性能影响

python - py2neo中批量创建或获取路径

python - xlwings 与 openpyxl 阅读 Excel 工作簿的区别

matlab - 生成具有给定概率matlab的随机数

算法二维引用翻译

python - 每次调用python脚本时如何避免重新加载ML模型?

Python解析XML并保存为txt

mysql - 搜索多个字段mysql的最快方法

jquery - jQuery animate 的性能问题