python中余弦的高效计算

python中余弦的高效计算,python,arrays,performance,numpy,trigonometry,Python,Arrays,Performance,Numpy,Trigonometry,我根据理论功率谱密度生成了一些时间序列 基本上,我的时空函数由X(t)=SUM_n sqrt(a_n)+cos(w_n t+phi_n)给出,其中a_n是给定w_n的PSD的值,而phi是某个随机相位。为了得到一个真实的时间序列,我必须总结2^25模式,当然我的t也是大小2^25 如果我用python实现这一点,这将需要几周的时间… 有没有办法加快速度?比如向量计算 t_full = np.linspace(0,1e-2,2**12, endpoint = False) signal = np

我根据理论功率谱密度生成了一些时间序列

基本上,我的时空函数由
X(t)=SUM_n sqrt(a_n)+cos(w_n t+phi_n)
给出,其中
a_n
是给定
w_n
PSD
的值,而
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为sqrt a_n,w=w,random.uniform表示随机相移φ

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

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)

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

@user2003965如果您能让问题更清楚一点,那就太好了。你能举一个你愿意做的过程的例子吗?一个问题:只要w或t_full克服212,我就会得到错误“数组太大”->但我必须对223个模式求和。。。关于这一点的想法:/@user2003965我正在检查
numpy
是否有一些参数可以增加这个阈值…@user2003965我还没有找到任何类似于一个简单的参数,你可以改变它来绕过
数组太大的错误。您可以选择将
0到0.01
间隔划分为10个子间隔。通过这种方式,您可以避免内存问题,并且只使用10个Python循环,这在性能方面不是很糟糕吗?我没有投反对票,我喜欢这种方式,感谢你的帮助!您的
w_n
是任意值,还是看起来像
w_n=2*np.pi*n/T