Indices of elements in a numpy array that appear in another.

    Fast routine for determining indices of elements in numpy array `X` that 
    appear in numpy array `Y`, returning a boolean array `Z` such that::

            Z[i] = X[i] in Y

    **Parameters**

            **X** :  numpy array

                    Numpy array to comapare to numpy array `Y`.  For each 
                    element of `X`, ask if it is in `Y`.

            **Y** :  numpy array

                    Numpy array to which numpy array `X` is compared.  For each 
                    element of `X`, ask if it is in `Y`.

    **Returns**

            **b** :  numpy array (bool)

                    Boolean numpy array, `len(b) = len(X)`.

    **See Also:**

            :func:`tabular.fast.recarrayisin`, 
            :func:`tabular.fast.arraydifference`

def isin(X,Y):
    """
    Indices of elements in a numpy array that appear in another.

    Fast routine for determining indices of elements in numpy array `X` that 
    appear in numpy array `Y`, returning a boolean array `Z` such that::

            Z[i] = X[i] in Y

    **Parameters**

            **X** :  numpy array

                    Numpy array to comapare to numpy array `Y`.  For each 
                    element of `X`, ask if it is in `Y`.

            **Y** :  numpy array

                    Numpy array to which numpy array `X` is compared.  For each 
                    element of `X`, ask if it is in `Y`.

    **Returns**

            **b** :  numpy array (bool)

                    Boolean numpy array, `len(b) = len(X)`.

    **See Also:**

            :func:`tabular.fast.recarrayisin`, 
            :func:`tabular.fast.arraydifference`

    """
    if len(Y) > 0:
        T = Y.copy()
        T.sort()
        D = T.searchsorted(X)
        T = np.append(T,np.array([0]))
        W = (T[D] == X)
        if isinstance(W,bool):
            return np.zeros((len(X),),bool)
        else:
            return (T[D] == X)
    else:
        return np.zeros((len(X),),bool)