| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- """
- The arraycrop module contains functions to crop values from the edges of an
- n-dimensional array.
- """
- import numpy as np
- from numbers import Integral
- __all__ = ['crop']
- def crop(ar, crop_width, copy=False, order='K'):
- """Crop array `ar` by `crop_width` along each dimension.
- Parameters
- ----------
- ar : array-like of rank N
- Input array.
- crop_width : {sequence, int}
- Number of values to remove from the edges of each axis.
- ``((before_1, after_1),`` ... ``(before_N, after_N))`` specifies
- unique crop widths at the start and end of each axis.
- ``((before, after),) or (before, after)`` specifies
- a fixed start and end crop for every axis.
- ``(n,)`` or ``n`` for integer ``n`` is a shortcut for
- before = after = ``n`` for all axes.
- copy : bool, optional
- If `True`, ensure the returned array is a contiguous copy. Normally,
- a crop operation will return a discontiguous view of the underlying
- input array.
- order : {'C', 'F', 'A', 'K'}, optional
- If ``copy==True``, control the memory layout of the copy. See
- ``np.copy``.
- Returns
- -------
- cropped : array
- The cropped array. If ``copy=False`` (default), this is a sliced
- view of the input array.
- """
- ar = np.array(ar, copy=False)
- if isinstance(crop_width, Integral):
- crops = [[crop_width, crop_width]] * ar.ndim
- elif isinstance(crop_width[0], Integral):
- if len(crop_width) == 1:
- crops = [[crop_width[0], crop_width[0]]] * ar.ndim
- elif len(crop_width) == 2:
- crops = [crop_width] * ar.ndim
- else:
- raise ValueError(
- f'crop_width has an invalid length: {len(crop_width)}\n'
- f'crop_width should be a sequence of N pairs, '
- f'a single pair, or a single integer'
- )
- elif len(crop_width) == 1:
- crops = [crop_width[0]] * ar.ndim
- elif len(crop_width) == ar.ndim:
- crops = crop_width
- else:
- raise ValueError(
- f'crop_width has an invalid length: {len(crop_width)}\n'
- f'crop_width should be a sequence of N pairs, '
- f'a single pair, or a single integer'
- )
- slices = tuple(slice(a, ar.shape[i] - b) for i, (a, b) in enumerate(crops))
- if copy:
- cropped = np.array(ar[slices], order=order, copy=True)
- else:
- cropped = ar[slices]
- return cropped
|