Sampling uniformly distributed random points inside a spherical volume

前端 未结 9 647
无人及你
无人及你 2020-11-27 13:10

I am looking to be able to generate a random uniform sample of particle locations that fall within a spherical volume.

The image below (courtesy of http://nojhan.fre

9条回答
  •  执笔经年
    2020-11-27 13:49

    I agree with Alleo. I translated your Matlab code to Python and it can generate thousands of points very fast (a fraction of second in my computer for 2D and 3D). I've even ran it for up to 5D hyperspheres. I found your code so useful that I'm applying it in a study. Tim McJilton, who should I add as reference?

    import numpy as np
    from scipy.special import gammainc
    from matplotlib import pyplot as plt
    def sample(center,radius,n_per_sphere):
        r = radius
        ndim = center.size
        x = np.random.normal(size=(n_per_sphere, ndim))
        ssq = np.sum(x**2,axis=1)
        fr = r*gammainc(ndim/2,ssq/2)**(1/ndim)/np.sqrt(ssq)
        frtiled = np.tile(fr.reshape(n_per_sphere,1),(1,ndim))
        p = center + np.multiply(x,frtiled)
        return p
    
    fig1 = plt.figure(1)
    ax1 = fig1.gca()
    center = np.array([0,0])
    radius = 1
    p = sample(center,radius,10000)
    ax1.scatter(p[:,0],p[:,1],s=0.5)
    ax1.add_artist(plt.Circle(center,radius,fill=False,color='0.5'))
    ax1.set_xlim(-1.5,1.5)
    ax1.set_ylim(-1.5,1.5)
    ax1.set_aspect('equal')
    

提交回复
热议问题