'Drop epochs based on indices or boolean mask.
.. note:: The indices refer to the current set of undropped epochs
rather than the complete set of dropped and undropped epochs.
They are therefore not necessarily consistent with any
external indices (e.g., behavioral logs). To drop epochs
based on external criteria, do not use the ``preload=True``
flag when constructing an Epochs object, and call this
method before calling the :func:`mne.Epochs.drop_bad` or
:func:`mne.Epochs.load_data` methods.
Parameters
indices : array of ints or bools
Set epochs to remove by specifying indices to remove or a boolean
mask to apply (where True values get removed). Events are
correspondingly modified.
reason : str
Reason for dropping the epochs (\'ECG\', \'timeout\', \'blink\' etc).
Default: \'USER\'.
verbose : bool, str, int, or None
If not None, override default verbose level (see
:func:`mne.verbose` and :ref:`Logging documentation <tut_logging>`
for more). Defaults to self.verbose.
Returns
epochs : instance of Epochs
The epochs with indices dropped. Operates in-place.'

@verbose
def drop(self, indices, reason='USER', verbose=None):

    indices = np.atleast_1d(indices)
    if (indices.ndim > 1):
        raise ValueError('indices    must    be    a    scalar    or    a    1-d    array')
    if (indices.dtype == bool):
        indices = np.where(indices)[0]
    out_of_bounds = ((indices < 0) | (indices >= len(self.events)))
    if out_of_bounds.any():
        first = indices[out_of_bounds][0]
        raise IndexError(('Epoch    index    %d    is    out    of    bounds' % first))
    for ii in indices:
        self.drop_log[self.selection[ii]].append(reason)
    self.selection = np.delete(self.selection, indices)
    self.events = np.delete(self.events, indices, axis=0)
    if self.preload:
        self._data = np.delete(self._data, indices, axis=0)
    count = len(indices)
    logger.info(('Dropped    %d    epoch%s' % (count, _pl(count))))
    return self
