# Buggy code
def reconstruct_object(flags, value):
    """Reconstructs the value (if necessary) after having saved it in a
    dictionary
    """
    if not isinstance(flags, list):
        flags = parse_flag_string(flags)
    if "sig" in flags:
        if isinstance(value, dict):
            from hyperspy.signal import BaseSignal

            value = BaseSignal(**value)
            value._assign_subclass()
        return value
    if "fn" in flags:
        ifdill, thing = value
        if ifdill is None:
            return thing
        if ifdill in [True, "True", b"True"]:
            return dill.loads(thing)
        # should not be reached
        raise ValueError("The object format is not recognized")
    return value


# 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 reconstruct_object(flags, value):
    """Reconstructs the value (if necessary) after having saved it in a
    dictionary
    """
    if not isinstance(flags, list):
        flags = parse_flag_string(flags)
    if "sig" in flags:
        if isinstance(value, dict):
            from hyperspy.signal import BaseSignal

            value = BaseSignal(**value)
            value._assign_subclass()
        return value
    if "fn" in flags:
        ifdill, thing = value
        if ifdill is None:
            return thing
        if ifdill in [True, "True", b"True"]:
            return dill.loads(thing)
        # should not be reached
        raise ValueError("The object format is not recognized")
    if isinstance(value, Array):
        value = value.compute()
    return value