# [SciPy-user] piecewise continuous distribution

Robert Kern robert.kern@gmail....
Mon Jul 20 22:45:32 CDT 2009

```On Mon, Jul 20, 2009 at 22:26, Brennan
Williams<brennan.williams@visualreservoir.com> wrote:
> I have a user-specified  piecewise continuous distribution defined by
> pairs of (value, cumulative probability).
>
> For example...
>
> Value ,    Cumulative Probability
> ---------------------------
> 1.0, 0.0
> 1.5, 0.2
> 2.3, 0.4
> 3.5, 0.6
> 5.2, 0.8
> 8.5, 1.0
>
> So no values below 1.0, none above 8.5.
> Between adjacent specified values the generated values will be uniformly
> distributed,
> i.e. the cumulative probability graph is made up of straight lines
>
> The generated values are created by a piece of TCL code.
>
> What I need to do is assign a pdf probability value to each generated value.
>
> How would I do this?

In [25]: x0 = np.array([1.0, 1.5, 2.3, 3.5, 5.2, 8.5])

In [26]: cdf = np.linspace(0, 1, len(x0))

In [27]: def pdf(x):
y = np.zeros_like(x)
inside = (x >= x0[0]) & (x <= x0[-1])
x = x[inside]
i = x0.searchsorted(x).clip(0, len(x0)-2)
block_pdf = np.diff(cdf) / np.diff(x0)
y[inside] = block_pdf[i]
return y
....:

In [35]: pdf(np.linspace(0.0, 10.0))
Out[35]:
array([ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
0.25      ,  0.25      ,  0.25      ,  0.16666667,  0.16666667,
0.16666667,  0.16666667,  0.11764706,  0.11764706,  0.11764706,
0.11764706,  0.11764706,  0.11764706,  0.06060606,  0.06060606,
0.06060606,  0.06060606,  0.06060606,  0.06060606,  0.06060606,
0.06060606,  0.06060606,  0.06060606,  0.06060606,  0.06060606,
0.06060606,  0.06060606,  0.06060606,  0.06060606,  0.06060606,
0.06060606,  0.06060606,  0.06060606,  0.06060606,  0.06060606,
0.06060606,  0.06060606,  0.        ,  0.        ,  0.        ,
0.        ,  0.        ,  0.        ,  0.        ,  0.        ])

> What is the best way to do it in scipy.stats?

Neither here nor there, really.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
-- Umberto Eco
```