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條經驗 獲得超14個贊
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)
添加回答
舉報