On Fri, Sep 10, 2010 at 6:32 PM, <[email protected]> wrote: > On Fri, Sep 10, 2010 at 8:28 PM, Charles R Harris > <[email protected]> wrote: > > > > > > On Fri, Sep 10, 2010 at 6:15 PM, Charles R Harris > > <[email protected]> wrote: > >> > >> > >> On Fri, Sep 10, 2010 at 5:46 PM, <[email protected]> wrote: > >>> > >>> I saw some questions on the web how to create non-uniform random > >>> integers in python. > >>> > >>> I don't know what the best way is but here is another way that looks > >>> reasonably fast > >>> > >>> >>> rvs = np.dot(np.random.multinomial(1, [0.1, 0.2, 0.5, 0.2], > >>> >>> size=1000000),np.arange(4)) > >>> > >>> >>> np.bincount(rvs)/1000000. > >>> array([ 0.099741, 0.199943, 0.499317, 0.200999]) > >>> > >> > >> This looks like a good case for the inverse cdf approach, at least for > >> smallish ranges of integers. Searchsorted on an array of appropriate > values > >> should do the trick. > >> > > > > For instance, weight 0..3 by 1..4, then > > > > In [14]: w = arange(1,5) > > > > In [15]: p = cumsum(w)/float(w.sum()) > > > > In [16]: bincount(p.searchsorted(random(1000000)))/1e6 > > Out[16]: array([ 0.100336, 0.200382, 0.299132, 0.40015 ]) > > Looks good, it feels faster and takes less memory, I guess. > > It's about 10x faster.
In [30]: timeit p.searchsorted(random(1000000)) 10 loops, best of 3: 37.6 ms per loop In [31]: timeit np.dot(np.random.multinomial(1, [0.1, 0.2, 0.5, 0.2], size=1000000),np.arange(4)) 1 loops, best of 3: 363 ms per loop Chuck
_______________________________________________ NumPy-Discussion mailing list [email protected] http://mail.scipy.org/mailman/listinfo/numpy-discussion
