'Allocate an output array whose rows should be passed to `self.compute`.
The resulting array must have a shape of ``shape``.
If we have standard outputs (i.e. self.outputs is NotSpecified), the
default is an empty ndarray whose dtype is ``self.dtype``.
If we have an outputs tuple, the default is an empty recarray with
``self.outputs`` as field names. Each field will have dtype
``self.dtype``.
This can be overridden to control the kind of array constructed
(e.g. to produce a LabelArray instead of an ndarray).'

def _allocate_output(self, windows, shape):

    missing_value = self.missing_value
    outputs = self.outputs
    if (outputs is not NotSpecified):
        out = recarray(shape, formats=([self.dtype.str] * len(outputs)), names=outputs)
        out[:] = missing_value
    else:
        out = full(shape, missing_value, dtype=self.dtype)
    return out
