<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def uniform_partition_fromintv(intv_prod, shape, nodes_on_bdry=False):
 """Return a partition of an interval product into equally sized cells. Parameters intv_prod : `IntervalProd` Interval product to be partitioned shape : int or sequence of ints Number of nodes per axis. For 1d intervals, a single integer can be specified. 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 ``intv_prod.ndim``. A single boolean is interpreted as a global choice for all boundaries. See Also -------- uniform_partition_fromgrid Examples -------- By default, no grid points are placed on the boundary: (array([ 0. , 0.25, 0.5 , 0.75, 1. ]),) (array([ 0.125, 0.375, 0.625, 0.875]),) This can be changed with the nodes_on_bdry parameter: (array([ 0. , 0.25, 0.75, 1. ]),) (array([ 0. , 0.5, 1. ]),) We can specify this per axis, too. In this case we choose both in the first axis and only the rightmost in the second: array([ 0. , 0.25, 0.75, 1. ]) array([ 0. , 0.5, 1. ]) array([ 0. , 0.4, 0.8, 1. ]) array([ 0.2, 0.6, 1. ]) """

    grid = uniform_grid_fromintv(intv_prod, shape, nodes_on_bdry=nodes_on_bdry)
    return RectPartition(intv_prod, grid)