scipy.stats.

truncate#

scipy.stats.truncate(X, lb=-inf, ub=inf)[source]#

Truncate the support of a random variable.

Given a random variable X, truncate returns a random variable with support truncated to the interval between lb and ub. The underlying probability density function is normalized accordingly.

Parameters:
XContinuousDistribution

The random variable to be truncated.

lb, ubfloat array-like

The lower and upper truncation points, respectively. Must be broadcastable with one another and the shape of X.

Returns:
XContinuousDistribution

The truncated random variable.

Notes

Array API Standard Support

truncate has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable SCIPY_ARRAY_API=1 and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.

Library

CPU

GPU

NumPy

n/a

CuPy

n/a

PyTorch

JAX

Dask

n/a

See Support for the array API standard for more information.

References

[1]

“Truncated Distribution”. Wikipedia. https://en.wikipedia.org/wiki/Truncated_distribution

Examples

Compare against scipy.stats.truncnorm, which truncates a standard normal, then shifts and scales it.

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy import stats
>>> loc, scale, lb, ub = 1, 2, -2, 2
>>> X = stats.truncnorm(lb, ub, loc, scale)
>>> Y = scale * stats.truncate(stats.Normal(), lb, ub) + loc
>>> x = np.linspace(-3, 5, 300)
>>> plt.plot(x, X.pdf(x), '-', label='X')
>>> plt.plot(x, Y.pdf(x), '--', label='Y')
>>> plt.xlabel('x')
>>> plt.ylabel('PDF')
>>> plt.title('Truncated, then Shifted/Scaled Normal')
>>> plt.legend()
>>> plt.show()
../../_images/scipy-stats-truncate-1_00_00.png

However, suppose we wish to shift and scale a normal random variable, then truncate its support to given values. This is straightforward with truncate.

>>> Z = stats.truncate(scale * stats.Normal() + loc, lb, ub)
>>> Z.plot()
>>> plt.show()
../../_images/scipy-stats-truncate-1_01_00.png

Furthermore, truncate can be applied to any random variable:

>>> Rayleigh = stats.make_distribution(stats.rayleigh)
>>> W = stats.truncate(Rayleigh(), lb=0.5, ub=3)
>>> W.plot()
>>> plt.show()
../../_images/scipy-stats-truncate-1_02_00.png