[Numpy-discussion] Permutations in Simulations`
Keith Goodman
kwgoodman at gmail.com
Tue Feb 10 15:58:37 EST 2009
On Tue, Feb 10, 2009 at 12:41 PM, Keith Goodman <kwgoodman at gmail.com> wrote:
> On Tue, Feb 10, 2009 at 12:28 PM, Keith Goodman <kwgoodman at gmail.com> wrote:
>> On Tue, Feb 10, 2009 at 12:18 PM, Keith Goodman <kwgoodman at gmail.com> wrote:
>>> On Tue, Feb 10, 2009 at 11:29 AM, Mark Janikas <mjanikas at esri.com> wrote:
>>>> I want to create an array that contains a column of permutations for each
>>>> simulation:
>>>>
>>>> import numpy as NUM
>>>>
>>>> import numpy.random as RAND
>>>>
>>>> x = NUM.arange(4.)
>>>>
>>>> res = NUM.zeros((4,100))
>>>>
>>>>
>>>> for sim in range(100):
>>>>
>>>> res[:,sim] = RAND.permutation(x)
>>>>
>>>>
>>>> Is there a way to do this without a loop? Thanks so much ahead of time…
>>>
>>> Does this work? Might not be faster but it does avoid the loop.
>>>
>>> import numpy as np
>>>
>>> def weirdshuffle(nx, ny):
>>> x = np.ones((nx,ny)).cumsum(0, dtype=np.int) - 1
>>> yidx = np.ones((nx,ny)).cumsum(1, dtype=np.int) - 1
>>> xidx = np.random.rand(nx,ny).argsort(0).argsort(0)
>>> return x[xidx, yidx]
>>
>> Hey, it is faster for nx=4, ny=100
>>
>> def baseshuffle(nx, ny):
>> x = np.arange(nx)
>> res = np.zeros((nx,ny))
>> for sim in range(ny):
>> res[:,sim] = np.random.permutation(x)
>> return res
>>
>>>> timeit baseshuffle(4,100)
>> 1000 loops, best of 3: 1.11 ms per loop
>>>> timeit weirdshuffle(4,100)
>> 10000 loops, best of 3: 127 µs per loop
>>
>> OK, who can cut that time in half? My first try looks clunky.
>
> This is a little faster:
>
> def weirdshuffle2(nx, ny):
> one = np.ones((nx,ny), dtype=np.int)
> x = one.cumsum(0)
> x -= 1
> yidx = one.cumsum(1)
> yidx -= 1
> xidx = np.random.random_sample((nx,ny)).argsort(0).argsort(0)
> return x[xidx, yidx]
>
>>> timeit weirdshuffle(4,100)
> 10000 loops, best of 3: 129 µs per loop
>>> timeit weirdshuffle2(4,100)
> 10000 loops, best of 3: 106 µs per loop
Sorry for all the mail.
def weirdshuffle3(nx, ny):
return np.random.random_sample((nx,ny)).argsort(0).argsort(0)
>> timeit weirdshuffle(4,100)
10000 loops, best of 3: 128 µs per loop
>> timeit weirdshuffle3(4,100)
10000 loops, best of 3: 37.5 µs per loop
More information about the NumPy-Discussion
mailing list