diff options
| author | Aaron LI <aaronly.me@outlook.com> | 2016-10-22 16:25:18 +0800 | 
|---|---|---|
| committer | Aaron LI <aaronly.me@outlook.com> | 2016-10-22 16:25:18 +0800 | 
| commit | 72f7433d50c4769a7d422ca2ec27a032b633a56d (patch) | |
| tree | 3c19deeab3dbb12ff38821011b3f6b85037d3b90 | |
| parent | cb839cb55a39bbd1342c5b03e85e79757ab6163b (diff) | |
| download | fg21sim-72f7433d50c4769a7d422ca2ec27a032b633a56d.tar.bz2 | |
Add utils/random.py: Custom random utilities
Currently implement "spherical_uniform()" to generate random points
uniformly distributed on the spherical surface.
| -rw-r--r-- | fg21sim/utils/random.py | 51 | 
1 files changed, 51 insertions, 0 deletions
| diff --git a/fg21sim/utils/random.py b/fg21sim/utils/random.py new file mode 100644 index 0000000..f652f6d --- /dev/null +++ b/fg21sim/utils/random.py @@ -0,0 +1,51 @@ +# Copyright (c) 2016 Weitian LI <liweitianux@live.com> +# MIT license + +""" +Custom utilities of random number generations. +""" + +import numpy as np + + +def spherical_uniform(n=1): +    """Uniformly pick random points on the surface of a unit sphere. +    The algorithm is described in [SpherePointPicking]_. + +    Parameters +    ---------- +    n : int +        Number of points to be randomly picked + +    Returns +    ------- +    theta : float, or 1D `~numpy.ndarray` +        The polar angles, φ ∈ [0, π]. (unit: rad) +        If ``n > 1``, then returns a 1D array containing all the generated +        coordinates. (unit: rad) +    phi : float, or 1D `~numpy.ndarray` +        The azimuthal angles, θ ∈ [0, 2π). + +    NOTE +    ---- +    Physicists usually adopt the (radial, polar, azimuthal) order with +    the (r, θ, φ) notation for the spherical coordinates convention, which +    is adopted here and by ``healpy``. +    However, this convention is *different* to the convention generally +    used by mathematicians. + +    References +    ---------- +    .. [SpherePointPicking] +       Wolfram MathWorld - Sphere Point Picking +       http://mathworld.wolfram.com/SpherePointPicking.html + +    .. [SphericalCoordinates] +       Wolfram MathWorld - Spherical Coordinates +       http://mathworld.wolfram.com/SphericalCoordinates.html +    """ +    u = np.random.uniform(size=n) +    v = np.random.uniform(size=n) +    phi = 2*np.pi * u +    theta = np.arccos(2*v - 1) +    return (theta, phi) | 
