# [Numpy-discussion] non-uniform discrete sampling with given probabilities (w/ and w/o replacement)

Christopher Jordan-Squire cjordan1@uw....
Wed Aug 31 15:58:08 CDT 2011

```On Wed, Aug 31, 2011 at 3:34 PM,  <josef.pktd@gmail.com> wrote:
> On Wed, Aug 31, 2011 at 3:22 PM, Olivier Delalleau <shish@keba.be> wrote:
>> 2011/8/31 Christopher Jordan-Squire <cjordan1@uw.edu>
>>>
>>> On Wed, Aug 31, 2011 at 2:07 PM, Olivier Delalleau <shish@keba.be> wrote:
>>> > You can use:
>>> > 1 + numpy.argmax(numpy.random.multinomial(1, [0.1, 0.2, 0.7]))
>>> >
>>> > For your "real" application you'll probably want to use a value >1 for
>>> > the
>>> > first parameter (equal to your sample size), instead of calling it
>>> > multiple
>>> > times.
>>> >
>>> > -=- Olivier
>>>
>>> Thanks. Warren (Weckesser) mentioned this possibility to me yesterday
>>> and I forgot to put it in my post. I assume you mean something like
>>>
>>> x = np.arange(3)
>>> y = np.random.multinomial(30, [0.1,0.2,0.7])
>>> z = np.repeat(x, y)
>>> np.random.shuffle(z)
>>>
>>> That look right?
>>>
>>> -Chris JS
>>>
>>
>> Yes, exactly.
>
> Chuck's answer to the same question, when I asked on the list, used
> searchsorted and is fast
>
> cdfvalues.searchsorted(np.random.random(size))
>
>
>    def rvs(self, size=1):
>        '''draw random variables with shape given by size
>
>        '''
>        #w = self.pdfvalues
>        #p = cumsum(w)/float(w.sum())
>        #p.searchsorted(np.random.random(size))
>        return self.support[self.cdfvalues.searchsorted(np.random.random(size))]
>
> Josef
>

That's exactly what I needed. Thanks!

-Chris JS

>
>>
>> -=- Olivier
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion@scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
```