Python 2.7 如何在python中加速随机数组生成

Python 2.7 如何在python中加速随机数组生成,python-2.7,math,optimization,numerical-methods,montecarlo,Python 2.7,Math,Optimization,Numerical Methods,Montecarlo,我想用Monte Carlo积分法求n球的体积,并将其与解析结果进行比较。我想对10^6点和10^9点这样做,虽然它对10^6点起作用(对于n=2(圆形)、n=3(球体)和n=12,大约需要一分钟),但对于10^9点来说,速度非常慢 MC方法的简短解释:为了找到半径为r=1的n-球体的体积,我想象一个简单已知的体积(比如边长为2*r的n-立方体),其中完全包含n-球体。然后我从n立方体中的均匀分布点取样,检查点是否位于球体中。我计算n球体内所有生成的点。V_sphere/V_cube的比率可以近

我想用Monte Carlo积分法求n球的体积,并将其与解析结果进行比较。我想对10^6点和10^9点这样做,虽然它对10^6点起作用(对于n=2(圆形)、n=3(球体)和n=12,大约需要一分钟),但对于10^9点来说,速度非常慢

MC方法的简短解释:为了找到半径为r=1的n-球体的体积,我想象一个简单已知的体积(比如边长为2*r的n-立方体),其中完全包含n-球体。然后我从n立方体中的均匀分布点取样,检查点是否位于球体中。我计算n球体内所有生成的点。V_sphere/V_cube的比率可以近似为N_inside/N_total,因此V_sphere=V_cube*N_inside/N_total

以下是函数:

def hyp_sphere_mc(d,samples):    

    inside = 0                     #number of points inside sphere                                             
    sum = 0                        #sum of squared components

    for j in range(0,samples):        

        x2 = np.random.uniform(0,1,d)**2     #generate random point in d-dimensions                           
        sum = np.sum(x2)                     #sum its components

        if(sum < 1.0):                                              
            inside += 1                      #count points inside sphere

    V = ((2)**d)*(float(inside)/samples)     #V = V_cube * N_inside/N_total           

    V_true = float(math.pi**(float(d)/2))/math.gamma(float(d)/2 + 1) #analytical result 

    ERR = (float(abs(V_true-V))/V_true)*100        #relative Error

    print "Numerical:", V, "\t" , "Exact: ", V_true, "\t", "Error: ", ERR
def hyp_sphere_mc(d,样本):
内=0#球体内的点数
总和=0#平方分量之和
对于范围内的j(0,样品):
x2=np.随机.均匀(0,1,d)**2#生成d维中的随机点
sum=np.sum(x2)#求其分量之和
如果(总和<1.0):
球内+=1#球内点数
V=((2)**d)*(浮动(内部)/样本)#V=V_立方体*N_内部/N_总数
V_true=float(math.pi**(float(d)/2))/math.gamma(float(d)/2+1)#分析结果
误差=(浮动(绝对值)(V_真-V))/V_真)*100相对误差
打印“数字:”,V,“\t”,“精确:”,V\u true,“\t”,“错误:”,ERR

我想问题是,对于每次迭代,我都会生成一个新的随机数组,这需要很多时间,特别是如果我有10^9次迭代。有什么方法可以加快速度吗?

您可以用以下方法替换循环:

inside = np.sum(np.sum(np.random.rand(samples,d)**2,1)<1)

inside=np.sum(np.sum(np.random.rand)(样本,d)**2,1)我刚刚尝试了这个,它将10^6点的时间从大约1-2分钟减少到1秒,10^8点减少到大约1 1/2分钟,而我会等30分钟,但仍然没有结果。太棒了,谢谢你!@Eren太棒了!记住numpy是关于通过使用矢量化消除循环的。可能需要一段时间才能习惯这种形式的循环墨水,但它是值得的(正如你所看到的)。当你要求一千倍以上的分数时,你对执行时间爆炸感到惊讶吗?