scipp.scipy.ndimage.percentile_filter(x, /, *, size=None, footprint=None, origin=0, **kwargs)#

Calculate a multidimensional percentile filter.

This is a wrapper around scipy.ndimage.percentile_filter(). See there for full argument description. There are two key differences:

  • This wrapper uses explicit dimension labels in the size, footprint, and origin arguments. For example, instead of size=[4, 6] use size={'time':4, 'space':6} (with appropriate dimension labels for the data).

  • Coordinate values can be used (and should be preferred) for size and origin. For example, instead of size=[4, 6] use size={'time':sc.scalar(5.0, unit='ms'), 'space':sc.scalar(1.2, unit='mm')}. In this case it is required that the corresponding coordinates exist and form a “linspace”, i.e., are evenly spaced.


When size is an integer or a mapping to integers or when footprint is given, coordinate values are ignored. That is, the filter is applied even if the data points are not evenly spaced. The resulting filtered data may thus have no meaningful interpretation.

  • x (scipp.typing.VariableLike) – Input variable or data array.

  • size (Union[int, Variable, Mapping[str, int | Variable], None], default: None) – Integer or scalar variable or mapping from dimension labels to integers or scalar variables. Defines the footprint (see below).

  • footprint (Optional[Variable], default: None) – Variable with same dimension labels (but different shape) as the input data. The boolean values specify (implicitly) a shape, but also which of the elements within this shape will get passed to the filter function.

  • origin (int | Variable | Mapping[str, int | Variable], default: 0) – Integer or scalar variable or mapping from dimension labels to integers or scalar variables. Controls the placement of the filter on the input array.


scipp.typing.VariableLike – Filtered variable or data array


>>> from scipp.scipy.ndimage import percentile_filter
>>> da =
>>> da.plot()

With size as integer:

>>> filtered = percentile_filter(da, size=4, percentile=80)
>>> filtered.plot()

With size based on input coordinate values:

>>> filtered = percentile_filter(da, size=sc.scalar(0.2, unit='mm'), percentile=80)
>>> filtered.plot()

With different size for different dimensions:

>>> filtered = percentile_filter(da, size={'x':sc.scalar(0.2, unit='mm'),
...                                        'y':sc.scalar(1.1, unit='mm')}, percentile=80)
>>> filtered.plot()