高效计算python中的余弦

use*_*965 4 python arrays performance trigonometry numpy

我从理论功率谱密度中生成一些时间序列.

基本上,我在时空中的函数由X(t) = SUM_n sqrt(a_n) + cos(w_n t + phi_n)下式给出,其中at是给定a_n值并且是一些随机相位.为了得到一个真实的时间序列,我必须总结模式,我的当然也是大小.PSDw_nphi2^25t2^25

如果我用python做到这一点,这将花费几周时间......
有什么方法可以加快速度吗?像一些矢量计算?

t_full = np.linspace(0,1e-2,2**12, endpoint = False) 
signal = np.zeros_like(t_full)
 for i in range(w.shape[0]):
        signal += dataCOS[i] * np.cos(2*np.pi* t_full * w[i] + random.uniform(0,2*np.pi)) 
Run Code Online (Sandbox Code Playgroud)

其中dataCOS是sqrt a_n,w = w,random.uniform表示随机相移phi

Sau*_*tro 6

您可以使用这些outer函数计算角度,然后沿一个轴求和,以矢量化方式获取信号:

import numpy as np

t_full = np.linspace(0, 1e-2, 2**12, endpoint=False)
thetas = np.multiply.outer((2*np.pi*t_full), w)
thetas += 2*pi*np.random.random(thetas.shape)

signal = np.cos(thetas)
signal *= dataCOS

signal = signal.sum(-1)
Run Code Online (Sandbox Code Playgroud)

这更快,因为当您使用Python for循环时,与循环相比,解释器将以较慢的速度C循环.在这种情况下,使用numpy外部操作可以计算C循环速度下的乘法和和.

  • @ user2003965如果你能让你的问题更清楚一点,那就太好了.你能举一个你愿意做的过程的例子吗? (3认同)