首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy数组的快速迭代

numpy数组的快速迭代
EN

Stack Overflow用户
提问于 2015-09-16 07:27:34
回答 2查看 722关注 0票数 7

我是python的新手,我正在尝试做一些基本的信号处理工作,我遇到了一个严重的性能问题。有没有一个python技巧可以用矢量化的方式做到这一点呢?基本上,我正在尝试实现一个一阶滤波器,但是滤波器的特性可能会从一个样本到下一个样本改变。如果只有一个过滤器,我会使用numpy.signal.lfilter(),但它有点棘手。下面是运行速度非常慢的代码片段:

代码语言:javascript
复制
#filter state
state = 0

#perform filtering
for sample in amplitude:
    if( sample == 1.0 ): #attack filter
        sample = (1.0 - att_coeff) * sample + att_coeff * state
    else: #release filter
        sample = (1.0 - rel_coeff) * sample + rel_coeff * state

    state = sample
EN

回答 2

Stack Overflow用户

发布于 2015-09-16 13:58:30

您可以考虑使用Python到本机代码的转换器之一,例如CythonNumbaPythran

例如,用timeit运行你的原始代码会给我带来:

代码语言:javascript
复制
$ python -m timeit -s 'from co import co; import numpy as np; a = np.random.random(100000)' 'co(a, .5, .7)'
10 loops, best of 3: 120 msec per loop

同时使用Pythran对其进行注释,如下所示:

代码语言:javascript
复制
#pythran export co(float[], float, float)
def co(amplitude, att_coeff, rel_coeff):
    # filter state
    state = 0

    # perform filtering
    for sample in amplitude:
        if sample == 1.0: # attack filter
            state = (1.0 - att_coeff) * sample + att_coeff * state
        else:             # release filter
            state = (1.0 - rel_coeff) * sample + rel_coeff * state
    return state

并使用以下命令进行编译

代码语言:javascript
复制
$ pythran co.py

给了我:

代码语言:javascript
复制
$ python -m timeit -s 'from co import co; import numpy as np; a = np.random.random(100000)' 'co(a, .5, .7)' 
1000 loops, best of 3: 253 usec per loop

这大概是x470的加速!我希望Numba和Cython能提供类似的加速。

票数 7
EN

Stack Overflow用户

发布于 2015-09-16 10:27:54

每条分录都需要上一条分录,必须先计算前一条分录,然后才能计算当前分录。因此,每个条目都必须串行计算,并且不能以矢量化(即映射、并行)的方式进行计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32597294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档