def uniform_grid(min_pt, max_pt, shape, nodes_on_bdry=True):
    """Return a grid from sampling an implicit interval product uniformly.

    Parameters
    ----------
    min_pt : float or sequence of float
        Vectors of lower ends of the intervals in the product.
    max_pt : float or sequence of float
        Vectors of upper ends of the intervals in the product.
    shape : int or sequence of ints
        Number of nodes per axis. Entries corresponding to degenerate axes
        must be equal to 1.
    nodes_on_bdry : bool or sequence, optional
        If a sequence is provided, it determines per axis whether to
        place the last grid point on the boundary (``True``) or shift it
        by half a cell size into the interior (``False``). In each axis,
        an entry may consist in a single bool or a 2-tuple of
        bool. In the latter case, the first tuple entry decides for
        the left, the second for the right boundary. The length of the
        sequence must be ``array.ndim``.

        A single boolean is interpreted as a global choice for all
        boundaries.

    Returns
    -------
    uniform_grid : `RectGrid`
        The resulting uniform grid.

    See Also
    --------
    uniform_grid_fromintv :
        sample a given interval product
    odl.discr.partition.uniform_partition :
        divide implicitly defined interval product into equally
        sized subsets

    Examples
    --------
    By default, the min/max points are included in the grid:

    >>> grid = odl.uniform_grid([-1.5, 2], [-0.5, 3], (3, 3))
    >>> grid.coord_vectors
    (array([-1.5, -1. , -0.5]), array([ 2. ,  2.5,  3. ]))

    If ``shape`` is supposed to refer to small subvolumes, and the grid
    should be their centers, use the option ``nodes_on_bdry=False``:

    >>> grid = odl.uniform_grid([-1.5, 2], [-0.5, 3], (2, 2),
    ...                         nodes_on_bdry=False)
    >>> grid.coord_vectors
    (array([-1.25, -0.75]), array([ 2.25,  2.75]))

    In 1D, we don't need sequences:

    >>> grid = odl.uniform_grid(0, 1, 3)
    >>> grid.coord_vectors
    (array([ 0. ,  0.5,  1. ]),)
    """
    return uniform_grid_fromintv(IntervalProd(min_pt, max_pt), shape,
                                 nodes_on_bdry=nodes_on_bdry)
Return a grid from sampling an implicit interval product uniformly.

    Parameters
    ----------
    min_pt : float or sequence of float
        Vectors of lower ends of the intervals in the product.
    max_pt : float or sequence of float
        Vectors of upper ends of the intervals in the product.
    shape : int or sequence of ints
        Number of nodes per axis. Entries corresponding to degenerate axes
        must be equal to 1.
    nodes_on_bdry : bool or sequence, optional
        If a sequence is provided, it determines per axis whether to
        place the last grid point on the boundary (``True``) or shift it
        by half a cell size into the interior (``False``). In each axis,
        an entry may consist in a single bool or a 2-tuple of
        bool. In the latter case, the first tuple entry decides for
        the left, the second for the right boundary. The length of the
        sequence must be ``array.ndim``.

        A single boolean is interpreted as a global choice for all
        boundaries.

    Returns
    -------
    uniform_grid : `RectGrid`
        The resulting uniform grid.

    See Also
    --------
    uniform_grid_fromintv :
        sample a given interval product
    odl.discr.partition.uniform_partition :
        divide implicitly defined interval product into equally
        sized subsets

    Examples
    --------
    By default, the min/max points are included in the grid:

    >>> grid = odl.uniform_grid([-1.5, 2], [-0.5, 3], (3, 3))
    >>> grid.coord_vectors
    (array([-1.5, -1. , -0.5]), array([ 2. ,  2.5,  3. ]))

    If ``shape`` is supposed to refer to small subvolumes, and the grid
    should be their centers, use the option ``nodes_on_bdry=False``:

    >>> grid = odl.uniform_grid([-1.5, 2], [-0.5, 3], (2, 2),
    ...                         nodes_on_bdry=False)
    >>> grid.coord_vectors
    (array([-1.25, -0.75]), array([ 2.25,  2.75]))

    In 1D, we don't need sequences:

    >>> grid = odl.uniform_grid(0, 1, 3)
    >>> grid.coord_vectors
    (array([ 0. ,  0.5,  1. ]),)