[SciPy-Dev] Generate random variates using Cython

Christoph Baumgarten christoph.baumgarten at gmail.com
Wed Jan 15 14:14:07 EST 2020


Hi,

I recently looked into rejection algorithms to generate random variates
that rely on repeatedly generating uniform random variates until a
termination condition is satisfied.
A pure Python implementation is reasonably fast but much slower than a C
implementation (e.g. Poisson distribution in numpy). I tried to use Cython
to adapt my Python code (I just started to look into Cython, so it could be
that I overlook something very basic) but I did not succeed and I would
like to ask for help.

The following code works that generates rvs on [0, 1] with density 3 x**2
as an example (compiling it generates a warning though: Warning Msg: Using
deprecated NumPy API, disable it with #define NPY_NO_DEPRECATED_API
NPY_1_7_API_VERSION)  but I struggle to get rid of the Python interaction
np.random.rand() to speed it up.

cimport numpy as np
from numpy cimport ndarray, float64_t
import numpy as np
def rvs(int N):
    cdef double u, v
    cdef int i
    cdef np.ndarray[np.float64_t, ndim=1] x = np.empty((N, ),
dtype=np.float64)
    for i in range(N):
        while (1):
            u = np.random.rand()
            v = np.random.rand()
            if u <= v*v:
                break
        x[i] = v
    return x

Following https://numpy.org/devdocs/reference/random/c-api.html (Cython API
for random), I tried
cimport numpy.random to use random_standard_uniform.
However, I get an error: 'numpy\random.pxd' not found

I get similar errors when trying to compile the Cython examles here:
https://docs.scipy.org/doc/numpy-1.17.0/reference/random/extending.html

Cython version: 0.29.14
Numpy 1.17.4
python 3.7.1

Any guidance on how to access the uniform distribution in numpy using
Cython would be great. Thanks

Christoph
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scipy-dev/attachments/20200115/077cdcf8/attachment.html>


More information about the SciPy-Dev mailing list