See Also
    --------
    revrand.utils.decorators.vectorize_args

    Examples
    --------
    The Rosenbrock function is commonly used as a performance test 
    problem for optimization algorithms. It and its derivatives are 
    included in `scipy.optimize` and is implemented as expected by the 
    family of optimization methods in `scipy.optimize`.

        def rosen(x):
            return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)

    This representation makes it unwieldy to perform operations such as 
    plotting since it is less straightforward to evaluate the function 
    on a `meshgrid`. This decorator helps reconcile the differences 
    between these representations.

    >>> from scipy.optimize import rosen

    >>> rosen(np.array([0.5, 1.5]))
    156.5

    >>> unvectorize_args(rosen)(0.5, 1.5) 
    ... # doctest: +NORMALIZE_WHITESPACE
    156.5    

    The `rosen` function is implemented in such a way that it 
    generalizes to the Rosenbrock function of any number of variables. 
    This decorator supports can support any functions defined in a 
    similar manner.

    The function with any number of arguments are well-defined:

    >>> rosen(np.array([0.5, 1.5, 1., 0., 0.2]))
    418.0

    >>> unvectorize_args(rosen)(0.5, 1.5, 1., 0., 0.2)
    ... # can accept any variable number of arguments!
    418.0

    Make it easier to work with for other operations

    >>> rosen_ = unvectorize_args(rosen)
    >>> y, x = np.mgrid[0:2.1:0.05, -1:1.2:0.05]
    >>> z = rosen_(x, y)
    >>> z.round(2)
    array([[ 104.  ,   85.25,   69.22, ...,  121.55,  146.42,  174.92],
           [  94.25,   76.48,   61.37, ...,  110.78,  134.57,  161.95],
           [  85.  ,   68.2 ,   54.02, ...,  100.5 ,  123.22,  149.47],
           ..., 
           [  94.25,  113.53,  133.57, ...,   71.83,   54.77,   39.4 ],
           [ 104.  ,  124.25,  145.22, ...,   80.55,   62.42,   45.92],
           [ 114.25,  135.48,  157.37, ...,   89.78,   70.57,   52.95]])

    Now this can be directly plotted with `mpl_toolkits.mplot3d.Axes3D` 
    and `ax.plot_surface`.

def unvectorize_args(fn):

    """
    See Also
    --------
    revrand.utils.decorators.vectorize_args

    Examples
    --------
    The Rosenbrock function is commonly used as a performance test 
    problem for optimization algorithms. It and its derivatives are 
    included in `scipy.optimize` and is implemented as expected by the 
    family of optimization methods in `scipy.optimize`.

        def rosen(x):
            return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)

    This representation makes it unwieldy to perform operations such as 
    plotting since it is less straightforward to evaluate the function 
    on a `meshgrid`. This decorator helps reconcile the differences 
    between these representations.

    >>> from scipy.optimize import rosen

    >>> rosen(np.array([0.5, 1.5]))
    156.5

    >>> unvectorize_args(rosen)(0.5, 1.5) 
    ... # doctest: +NORMALIZE_WHITESPACE
    156.5    

    The `rosen` function is implemented in such a way that it 
    generalizes to the Rosenbrock function of any number of variables. 
    This decorator supports can support any functions defined in a 
    similar manner.

    The function with any number of arguments are well-defined:

    >>> rosen(np.array([0.5, 1.5, 1., 0., 0.2]))
    418.0

    >>> unvectorize_args(rosen)(0.5, 1.5, 1., 0., 0.2)
    ... # can accept any variable number of arguments!
    418.0

    Make it easier to work with for other operations

    >>> rosen_ = unvectorize_args(rosen)
    >>> y, x = np.mgrid[0:2.1:0.05, -1:1.2:0.05]
    >>> z = rosen_(x, y)
    >>> z.round(2)
    array([[ 104.  ,   85.25,   69.22, ...,  121.55,  146.42,  174.92],
           [  94.25,   76.48,   61.37, ...,  110.78,  134.57,  161.95],
           [  85.  ,   68.2 ,   54.02, ...,  100.5 ,  123.22,  149.47],
           ..., 
           [  94.25,  113.53,  133.57, ...,   71.83,   54.77,   39.4 ],
           [ 104.  ,  124.25,  145.22, ...,   80.55,   62.42,   45.92],
           [ 114.25,  135.48,  157.37, ...,   89.78,   70.57,   52.95]])

    Now this can be directly plotted with `mpl_toolkits.mplot3d.Axes3D` 
    and `ax.plot_surface`.

    """
    @wraps(fn)
    def new_fn(*args):
        return fn(np.asarray(args))
    return new_fn