EXTRAP1D : Extrapolate values from a 1D vector at its beginning and end using reversal of this array
    
    @note : gaps in vector Z should be filled first as values from the vector are replicated out of edges
    @note : if isinstance(Z,np.ma.masked_array) : mask = Z.mask
    
    @param Z: 1D vector to extrapolate
    @param mask: mask flag of the vector 
    
    @author: Renaud DUSSURGET, LER/PAC, Ifremer La Seyne

def extrap1d(Z,mask):
    """    
    EXTRAP1D : Extrapolate values from a 1D vector at its beginning and end using reversal of this array
    
    @note : gaps in vector Z should be filled first as values from the vector are replicated out of edges
    @note : if isinstance(Z,np.ma.masked_array) : mask = Z.mask
    
    @param Z: 1D vector to extrapolate
    @param mask: mask flag of the vector 
    
    @author: Renaud DUSSURGET, LER/PAC, Ifremer La Seyne
    """
    Zout=Z.copy()
    N=len(Zout)
    ind=np.arange(N)
    xout=ind[mask]
    hist=(~mask).astype(int)
    dhist=hist[1:]-hist[:-1]
    st=ind[dhist==1]+1
    if len(st) > 0 :
        st=st[0]
        Zout[:st]=Z[st] - (np.roll(Z,-st-1)[:st][::-1] - Z[st])
    en=ind[dhist==-1]
    if len(en) > 0 :
        en=en[-1]
        Zout[en+1:]=Z[en] - (np.roll(Z,-en)[::-1][:N-en-1] - Z[en])
    return Zout