def clip(input_array, clip_val, top_or_bottom, output=False):
    """
    Clip an input numpy array and set the clipped pixels to the
    clipping value. Bottom clip scales pixels below the clip_val.
    Top does the same for pixels above.
    """
    # Input validation
    error = "input_array for clip must be a numpy array instance."
    assert isinstance(input_array, N.ndarray), error
    error = "clip_val must be float"
    assert isinstance(clip_val, float), error
    error = 'top_or_bottom for clip must be "top" or "bottom".'
    assert top_or_bottom in ["top", "bottom"], error

    if top_or_bottom == "bottom":
        index = N.where(input_array < clip_val)
    elif top_or_bottom == "top":
        index = N.where(input_array > clip_val)
    output_array = copy.deepcopy(input_array)
    output_array[index] = clip_val
    if output != False:
        before_after(
            before_array=input_array,
            after_array=output_array,
            before_array_name="Input Data",
            after_array_name="Clip " + top_or_bottom + " at " + str(clip_val),
            output=output,
        )
    return output_array
    def log(self, output=False):
        """
        Take the log of self.data.
        """
        array_log = N.log(self.data)

        if output != False:
            before_after(
                before_array=self.data,
                after_array=array_log,
                before_array_name="Input Data",
                after_array_name="Log",
                output=output,
            )

        self.data = array_log
    def threshold_clip(self, minimum, maximum, output=False):
        """
        Set all values below minum and above maximum to the
        minimum and maximum, respectively 
        """
        output_array = copy.deepcopy(self.data)
        output_array[output_array > maximum] = maximum
        output_array[output_array < minimum] = minimum

        if output != False:
            before_after(
                before_array=self.data,
                after_array=output_array,
                before_array_name="Input Data",
                after_array_name="Threshold Clipped",
                output=output,
                pause=False,
            )

        self.data = output_array
    def positive(self, output=False):
        """
        Shift all the values in self.data so there are no negative or 0 pixels.
        Needed to prevent taking the log of negative values.
        This function is not currently used.
        """
        min_val = N.min(self.data)
        if min_val <= 0:
            output_array = self.data + ((min_val * -1.0) + 0.0001)
        else:
            output_array = self.data

        if output != False:
            before_after(
                before_array=self.data,
                after_array=output_array,
                before_array_name="Input Data",
                after_array_name="Positive Corrected",
                output=output,
                pause=False,
            )

        self.data = output_array