def convolve(in1, in2, mode='<STR_LIT>'):
volume = asarray(in1)<EOL>kernel = asarray(in2)<EOL>if volume.ndim == kernel.ndim == <NUM_LIT:0>:<EOL><INDENT>return volume * kernel<EOL><DEDENT>slice_obj = [slice(None, None, -<NUM_LIT:1>)] * len(kernel.shape)<EOL>if np.iscomplexobj(kernel):<EOL><INDENT>return correlate(volume, kernel[slice_obj].conj(), mode)<EOL><DEDENT>else:<EOL><INDENT>return correlate(volume, kernel[slice_obj], mode)<EOL><DEDENT>
Convolve two N-dimensional arrays.

Convolve `in1` and `in2`, with the output size determined by the
`mode` argument.

Parameters
----------
in1 : array_like
    First input.
in2 : array_like
    Second input. Should have the same number of dimensions as `in1`;
    if sizes of `in1` and `in2` are not equal then `in1` has to be the
    larger array.
mode : str {'full', 'valid', 'same'}, optional
    A string indicating the size of the output:

    ``full``
       The output is the full discrete linear convolution
       of the inputs. (Default)
    ``valid``
       The output consists only of those elements that do not
       rely on the zero-padding.
    ``same``
       The output is the same size as `in1`, centered
       with respect to the 'full' output.

Returns
-------
convolve : array
    An N-dimensional array containing a subset of the discrete linear
    convolution of `in1` with `in2`.

See also
--------
numpy.polymul : performs polynomial multiplication (same operation, but
                also accepts poly1d objects)