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. Josef > > Chuck > > _______________________________________________ > NumPy-Discussion mailing list > [email protected] > http://mail.scipy.org/mailman/listinfo/numpy-discussion > > _______________________________________________ NumPy-Discussion mailing list [email protected] http://mail.scipy.org/mailman/listinfo/numpy-discussion
