2 回答
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)
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)
添加回答
举报