Python中计算余弦值的高效方法

4

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

基本上,我的时间空间函数由X(t) = SUM_n sqrt(a_n) + cos(w_n t + phi_n) 组成,其中a_n是在给定的 w_nPSD 的值,而phi则是一些随机相位。为了获得逼真的时间序列,我必须总结2^25个模式,而我的t当然也要达到2^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)) 

其中,dataCOS是a_n的平方根,w = w,random.uniform表示随机相位偏移phi


1
你的w_n是任意值还是像w_n = 2 * np.pi * n / T这样的值? - Jaime
1个回答

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 循环速度计算乘法和求和,从而提高运行速度。


3
如果您能让问题更加清晰明了就好了。你能否给出一个你想要做的过程的例子? - Saullo G. P. Castro
1
@user2003965 我正在检查 numpy 是否有一些参数可以增加这个阈值... - Saullo G. P. Castro
1
@user2003965 我没有找到任何像简单参数那样的东西,可以更改以绕过“数组太大”错误。您有一些替代方案,例如将“0到0.01”间隔分成10个子间隔。这样,您将避免内存问题,并仅使用10个Python循环,这在性能方面不会太糟糕。 - Saullo G. P. Castro
1
我没有给你的回答点踩,我很喜欢你的方法并且感谢你的帮助! - user2003965
1
@user2003965,是的,这非常简单,值得再提一个问题! - Saullo G. P. Castro
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接