truncate — SciPy v1.15.3 Manual (original) (raw)

scipy.stats.

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.

References

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 withtruncate.

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, ub=3) W.plot() plt.show()

../../_images/scipy-stats-truncate-1_02_00.png