# Buggy code
def _slice_target(target, dims, both_slices, slice_nav=None, issignal=False):
    """Slices the target if appropriate

    Parameters
    ----------
    target : object
        Target object
    dims : tuple
        (navigation_dimensions, signal_dimensions) of the original object that
        is sliced
    both_slices : tuple
        (original_slices, array_slices) of the operation that is performed
    slice_nav : {bool, None}
        if None, target is returned as-is. Otherwise navigation and signal
        dimensions are sliced for True and False values respectively.
    issignal : bool
        if the target is signal and should be sliced as one
    """
    if slice_nav is None:
        return target
    if target is None:
        return None
    nav_dims, sig_dims = dims
    slices, array_slices = both_slices
    if slice_nav is True:  # check explicitly for safety
        if issignal:
            return target.inav[slices]
        if isinstance(target, np.ndarray):
            return np.atleast_1d(target[tuple(array_slices[:nav_dims])])
        raise ValueError(
            "tried to slice with navigation dimensions, but was neither a "
            "signal nor an array"
        )
    if slice_nav is False:  # check explicitly
        if issignal:
            return target.isig[slices]
        if isinstance(target, np.ndarray):
            return np.atleast_1d(target[tuple(array_slices[-sig_dims:])])
        raise ValueError(
            "tried to slice with navigation dimensions, but was neither a "
            "signal nor an array"
        )


# Traceback (IndexError)
s
<LazyEELSSpectrum, title: EELS Spectrum Image 0eV, dimensions: (3, 3|2048)>
s.align_zero_loss_peak(True) # Or False
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-4-8925d1fde6ab> in <module>()
----> 1 s.align_zero_loss_peak(True) # or False

c:\users\thomasaar\documents\hyperspy\hyperspy\_signals\eels.py in align_zero_loss_peak(self, calibrate, also_align, print_stats, subpixel, mask, signal_range, show_progressbar, **kwargs)
266
267         zlpc = estimate_zero_loss_peak_centre(self, mask, signal_range)
--> 268         mean_ = without_nans(zlpc.data).mean()
269         if print_stats is True:
270             print()

c:\users\thomasaar\documents\hyperspy\hyperspy\misc\utils.py in without_nans(data)
756
757 def without_nans(data):
--> 758     return data[~np.isnan(data)]
759
760

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\core.py in __getitem__(self, index)
1239             return self
1240
-> 1241         dsk, chunks = slice_array(out, self.name, self.chunks, index)
1242
1243         dsk2 = sharedict.merge(self.dask, (out, dsk))

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_array(out_name, in_name, blockdims, index)
137
138     # Pass down to next function
--> 139     dsk_out, bd_out = slice_with_newaxes(out_name, in_name, blockdims, index)
140
141     bd_out = tuple(map(tuple, bd_out))

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_with_newaxes(out_name, in_name, blockdims, index)
159
160     # Pass down and do work
--> 161     dsk, blockdims2 = slice_wrap_lists(out_name, in_name, blockdims, index2)
162
163     if where_none:

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in slice_wrap_lists(out_name, in_name, blockdims, index)
200         raise IndexError("Too many indices for array")
201     for bd, i in zip(blockdims, index):
--> 202         check_index(i, sum(bd))
203
204     # Change indices like -1 to 9

C:\Users\thomasaar\AppData\Local\Continuum\Anaconda3\lib\site-packages\dask\array\slicing.py in check_index(ind, dimension)
711         x = np.array(ind)
712         if (x >= dimension).any() or (x <= -dimension).any():
--> 713             raise IndexError("Index out of bounds %s" % dimension)
714     elif isinstance(ind, slice):
715         return

IndexError: Index out of bounds 200

# Fixed code
def _slice_target(target, dims, both_slices, slice_nav=None, issignal=False):
    """Slices the target if appropriate

    Parameters
    ----------
    target : object
        Target object
    dims : tuple
        (navigation_dimensions, signal_dimensions) of the original object that
        is sliced
    both_slices : tuple
        (original_slices, array_slices) of the operation that is performed
    slice_nav : {bool, None}
        if None, target is returned as-is. Otherwise navigation and signal
        dimensions are sliced for True and False values respectively.
    issignal : bool
        if the target is signal and should be sliced as one
    """
    if slice_nav is None:
        return target
    if target is None:
        return None
    nav_dims, sig_dims = dims
    slices, array_slices = both_slices
    if slice_nav is True:  # check explicitly for safety
        if issignal:
            return target.inav[slices]
        sl = tuple(array_slices[:nav_dims])
        if isinstance(target, np.ndarray):
            return np.atleast_1d(target[sl])
        if isinstance(target, dArray):
            return target[sl]
        raise ValueError(
            "tried to slice with navigation dimensions, but was neither a "
            "signal nor an array"
        )
    if slice_nav is False:  # check explicitly
        if issignal:
            return target.isig[slices]
        sl = tuple(array_slices[-sig_dims:])
        if isinstance(target, np.ndarray):
            return np.atleast_1d(target[sl])
        if isinstance(target, dArray):
            return target[sl]
        raise ValueError(
            "tried to slice with navigation dimensions, but was neither a "
            "signal nor an array"
        )