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 variableSCIPY_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()
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()
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()