<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def is_shape(obj, shape):
 """ Compare the shape of a numpy.ndarray to a target shape, with any value less than zero being considered a wildcard Note that if a list- like object is passed that is not a numpy array, this function will not convert it and will return False. Parameters --------- obj : np.ndarray Array to check the shape on shape : list or tuple Any negative term will be considered a wildcard Any tuple term will be evaluated as an OR Returns --------- shape_ok: bool, True if shape of obj matches query shape Examples In [1]: a = np.random.random((100, 3)) In [2]: a.shape Out[2]: (100, 3) In [3]: trimesh.util.is_shape(a, (-1, 3)) Out[3]: True In [4]: trimesh.util.is_shape(a, (-1, 3, 5)) Out[4]: False In [5]: trimesh.util.is_shape(a, (100, -1)) Out[5]: True In [6]: trimesh.util.is_shape(a, (-1, (3, 4))) Out[6]: True In [7]: trimesh.util.is_shape(a, (-1, (4, 5))) Out[7]: False """


    # if the obj.shape is different length than
    # the goal shape it means they have different number
    # of dimensions and thus the obj is not the query shape
    if (not hasattr(obj, 'shape') or
            len(obj.shape) != len(shape)):
        return False

    # loop through each integer of the two shapes
    # multiple values are sequences
    # wildcards are less than zero (i.e. -1)
    for i, target in zip(obj.shape, shape):
        # check if current field has multiple acceptable values
        if is_sequence(target):
            if i in target:
                # obj shape is in the accepted values
                continue
            else:
                return False

        # check if current field is a wildcard
        if target < 0:
            if i == 0:
                # if a dimension is 0, we don't allow
                # that to match to a wildcard
                # it would have to be explicitly called out as 0
                return False
            else:
                continue
        # since we have a single target and a single value,
        # if they are not equal we have an answer
        if target != i:
            return False

    # since none of the checks failed the obj.shape
    # matches the pattern
    return True