2013-10-14 115 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