将方波函数应用于 numpy 数组

我可以快速将 cos 函数应用到 float32 numpy 数组:

 cos_f = np.vectorize(lambda x: math.cos(2 * math.pi * x))
 signal = square_f(integral)

但是,如果我尝试这样做:

 square_f = np.vectorize(lambda x: sig.square(2 * math.pi * x))
 signal = square_f(integral)

60,000 个样本需要 15 秒。integral长度为1024,用作缓冲区。

我应该如何将方波应用于我的信号?


沧海一幻觉
浏览 101回答 2
2回答

德玛西亚99

我不确定你np.vectorize是否需要这里:import numpy as npfrom scipy import signal as sigintegral = np.linspace(0, 10, 1024)signal1 = np.cos(2*np.pi * integral)signal2 = sig.square(2*np.pi * integral)当然,您也可以创建一个函数,然后使用数组作为输入来调用它:def cos2pi(x):    return np.cos(2*np.pi * x)signal1 = cos2pi(integral)我们还可以更进一步,对所有样本同时调用该函数一次。samples = np.random.random((60000, 1024))signal1 = cos2pi(samples)

翻翻过去那场雪

sig.square(2*np.pi * x)比 慢三倍np.cos(2*np.pi * x),但是,这不是瓶颈。这种np.vectorize基于漂亮的装饰实际上会导致 120 倍的减速!发生这种情况的原因是它square_f适用scipy.signal.square于正在迭代的项目,这是一组旨在与数组一起使用的算术(与 不同math.cos)。这是内部完成的算术示例scipy.signal.square:def example(x, w=0.5):&nbsp; &nbsp; return (1 - (w > 1) | (w < 0)) & (np.mod(x, 2 * pi) < w * 2 * np.pi)假设arr是一个大数组,这显然example(arr)比调用更高效ex = np.vectorize(lambda x: example(x))ex(arr)时间安排也表明:arr = np.linspace(0,1,1000000)%timeit ex(arr)%timeit example(arr)8.13 s ± 208 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)18.5 ms ± 1.14 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python