python - numpy 数组的快速迭代

标签 python arrays numpy filtering signal-processing

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

#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

最佳答案

您可以考虑使用一种 Python 到 native 代码的转换器, 例如Cython , NumbaPythran .

例如,使用 timeit 运行您的原始代码会给我:

$ 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 注释它,如:

#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

并编译它

$ pythran co.py

给我:

$ 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 能提供类似的加速。

关于python - numpy 数组的快速迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32597294/

相关文章:

python - 将 'while' 循环中的数据存储在数组中

python - NumPy - 使用强度值矩阵的图像(矩阵)阈值处理。

python - OR 运算符内的 OR 运算符 - RegEX

arrays - Swift 字典查找导致编译时错误

c++ - 在数组中插入多个元素——计时函数

java - 是否可以通过在 for 循环中调用字符串名称来检查数百个字符串数组?

python - 输入记录与 python mapreduce 中的输出记录不匹配

python - 在 python 中丢失标准输出数据

python - _raise_connection_failure 中的 AutoReconnectpymongo.pool

python - 在 Python 中插入 3D 数组