human
Complete the below
def guvectorize(ftylist, signature, **kws):

    ''''guvectorize(ftylist, signature, target=\'cpu\', identity=None, **kws)
    A decorator to create numpy generialized-ufunc object from Numba compiled
    code.
    Args
    ftylist: iterable
    An iterable of type signatures, which are either
    function type object or a string describing the
    function type.
    signature: str
    A NumPy generialized-ufunc signature.
    e.g. "(m, n), (n, p)->(m, p)"
    identity: int, str, or None
    The identity (or unit) value for the element-wise function
    being implemented.  Allowed values are None (the default), 0, 1,
    and "reorderable".
    cache: bool
    Turns on caching.
    target: str
    A string for code generation target.  Defaults to "cpu".
    Returns
    A NumPy generialized universal-function
    Example
    @guvectorize([\'void(int32[:,:], int32[:,:], int32[:,:])\',
    \'void(float32[:,:], float32[:,:], float32[:,:])\'],
    \'(x, y),(x, y)->(x, y)\')
    def add_2d_array(a, b):
    for i in range(c.shape[0]):
    for j in range(c.shape[1]):
    c[i, j] = a[i, j] + b[i, j]'
    '''
assistant
#Here is the Python code you requested.
    if isinstance(ftylist, str):
        ftylist = [ftylist]
    def wrap(func):
        guvec = GUVectorize(func, signature, **kws)
        for fty in ftylist:
            guvec.add(fty)
        return guvec.build_ufunc()
    return wrap