2013-10-14 83 views
4

我用理论功率谱密度生成了一些时间序列。python中余弦的高效计算

基本上,我的在时间 - 空间函数由X(t) = SUM_n sqrt(a_n) + cos(w_n t + phi_n),其中a_nPSD在给定w_nphi值给定为一些随机相位。为了得到一个现实的时间序列,我必须总结2^25模式,当然我的t的大小也是2^25

如果我这样做与蟒蛇,这将需要几个星期...
有没有什么办法来加速呢?像一些矢量计算?

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

其中dataCOS是SQRT A_N,W = w和random.uniform表示随机相移披

+1

你的'w_n'是否是任意值,还是它们看起来像'w_n = 2 * np.pi * n/T'? – Jaime

回答

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) 

这是更快,因为当你使用一个Python for循环解释将循环以较慢的速度相比C循环。在这种情况下,使用numpy外部操作允许您计算循环速度为C的乘法和和。

+0

好吧,也许我的问题还不够清楚我使用的是alreads arrys(t是一个数组),我必须总结一些数十亿的模式,每个cosine的时间样例的总和! – user2003965

+3

@ user2003965如果你能让你的问题变得更清晰,那将会很好。你能举一个你愿意做的过程的例子吗? –

+0

好的,这似乎给了我同样的结果,但你能向我解释为什么这样更快吗? – user2003965