为了账号安全,请及时绑定邮箱和手机立即绑定

将方波函数应用于 numpy 数组

将方波函数应用于 numpy 数组

沧海一幻觉 2023-09-12 15:06:44
我可以快速将 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,用作缓冲区。我应该如何将方波应用于我的信号?
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

我不确定你np.vectorize是否需要这里:


import numpy as np

from scipy import signal as sig


integral = 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)


查看完整回答
反对 回复 2023-09-12
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

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):

    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)


查看完整回答
反对 回复 2023-09-12
  • 2 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信