Skip to main content

kernels.sigclip

kernels.sigclip(
    arr,
    *,
    mask=None,
    sigma=(3.0, 3.0),
    maxiters=5,
    ddof=0,
    nkeep=1,
    maxrej=None,
    cenfunc='median',
    clip_cen=None,
    stdfunc='std',
    revert_on_nkeep=True,
    grow=None,
    validate=True,
)

Sigma-clipping rejection.

Parameters

arr : (ndarray, shape(N, *spatial))

Image stack. Accepted dtypes are uint8, uint16, int16, int32, float32, and float64. Integer inputs are promoted to the package’s floating workspace when validate is True. Inputs with more than 3 dimensions are flattened internally; output shapes match the trailing spatial dimensions of the input.

mask : ndarray of bool = None

Input mask; True means already masked. Must have the same shape as arr before any internal flattening.

sigma : float or tuple of float = (3.0, 3.0)

User-supplied clipping multiplier, not the measured data spread itself. Values are clipped when their residual from the clipping center exceeds sigma * spread. A scalar applies the same multiplier to both tails; a 2-tuple (sigma_lower, sigma_upper) clips asymmetrically. Thresholds must be finite and non-negative.

maxiters : int = 5

Maximum number of clipping iterations per pixel.

ddof : int = 0

Delta degrees of freedom for the per-pixel spread estimator.

nkeep : int = 1

Minimum number of unmasked values to preserve at each pixel. An iteration that would drop below this count is reverted in full. The default, 1, prevents clipping from rejecting every finite sample in a per-output stack. Set 0 only when all samples may be rejected.

maxrej : int or None = None

Maximum number of values that may be rejected at each pixel. None means no limit.

cenfunc : {'median', 'lmedian', 'mean'} = 'median'

Center estimator used each iteration. lmedian accepts the alias lmed and uses the lower of the two middle samples for even valid counts.

clip_cen : {'median', 'lmedian', 'mean'} or None = None

Center used when computing the spread for iterative rejection. None uses the same center as cenfunc. Choices are "median", "lmedian", "lmed", and "mean".

revert_on_nkeep : bool = True

If True, an iteration that would leave fewer than nkeep usable samples at a pixel is reverted in full for that pixel. Input masks, threshold masks, and non-finite samples remain excluded. The default is True. If False, clipping is strict and may leave fewer than nkeep samples.

stdfunc : {'std', 'mad'} = 'std'

Spread estimator used by sigma clipping. "std" uses the standard deviation. "mad" uses 1.4826 * median(abs(x - clip_cen)) as a robust sigma estimate and ignores ddof.

grow : float or None = None

Optional radius in pixels used to grow mask_rej spatially after rejection. Axis 0 is the stack axis and is never grown across. None disables growth and skips the extra calculation.

validate : bool = True

If True, check dimensionality and normalize dtype/contiguity before entering the Rust kernel. If False, callers must provide inputs that satisfy the compiled kernel assumptions.

Returns

mask_rej : ndarray of bool, shape (N, *spatial)

True for excluded samples, including input masks and non-finite values. LinearClip excludes input-mask entries; its disabled default returns an all-false mask (see Notes). Thus mask_rej.sum(axis=0) need not count only newly rejected samples.

std : (ndarray, shape(*spatial) or None)

Clipping spread for SigClip; reference noise for CCDClip (see Notes). None for rejection algorithms without a spread diagnostic.

low : (ndarray, shape(*spatial))

Minimum retained value before growth. LinearClip instead reports its last accepted lower interval bound. Use mask_rej to identify survivors.

upp : (ndarray, shape(*spatial))

Maximum retained value before growth. LinearClip instead reports its last accepted upper interval bound. Use mask_rej to identify survivors.

nit : ndarray of uint8, shape (*spatial)

Iteration-count map.

output_flags : ndarray of uint8, shape (*spatial)

Bit-coded status. 0 means normal completion; bit 1 means at least one pre-masked sample at this output element; bit 16 means grow added at least one rejected sample at this output element. Iterative kernels also use bit 2 for maxiters, bit 4 for nkeep, and bit 8 for maxrej. Bits are OR-ed. output_flags is a per-output diagnostic; use mask_rej to inspect individual samples.

Notes

For the current finite, unmasked samples, let c be the cenfunc center, a the clip_cen center, and n the sample count. Retain::

c - sigma_lower * d <= x <= c + sigma_upper * d

x is a sample value; sigma=(sigma_lower, sigma_upper) sets the two multipliers, or a scalar uses the same multiplier for both tails. The spread is d = sqrt(sum((x - a)**2) / (n - ddof)) for stdfunc="std", or d = 1.4826 * median(abs(x - a)) for stdfunc="mad". MAD ignores ddof; standard deviation is undefined when n <= ddof. clip_cen=None uses the same center as cenfunc.

Equality is retained. Recompute center and spread after each accepted pass; stop when no new samples are rejected, the spread is undefined, a safeguard reverts the pass, or maxiters is reached. Earlier rejections remain excluded. When requested, std describes the clipping spread, not the uncertainty of the combined output; low and upp report the final retained extrema. For derivations and worked examples, see the Rejection Methods tutorial.