[Numpy-discussion] Permutations in Simulations`
Mark Janikas
mjanikas at esri.com
Tue Feb 10 19:21:12 EST 2009
Thanks to all for your replies. I want this to work on any vector so I was thinking this...?
import numpy as np
import timeit
x = np.array([4.,5.,10.,3.,5.,6.,7.,2.,9.,1.])
nx = 10
ny = 100
def weirdshuffle4(x, ny):
nx = len(x)
indices = np.random.random_sample((nx,ny)).argsort(0).argsort(0)
return x[indices]
t=timeit.Timer("weirdshuffle4(x,ny)", "from __main__ import *")
print t.timeit(100)
0.0148663153873
-----Original Message-----
From: numpy-discussion-bounces at scipy.org [mailto:numpy-discussion-bounces at scipy.org] On Behalf Of Keith Goodman
Sent: Tuesday, February 10, 2009 12:59 PM
To: Discussion of Numerical Python
Subject: Re: [Numpy-discussion] Permutations in Simulations`
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
_______________________________________________
Numpy-discussion mailing list
Numpy-discussion at scipy.org
http://projects.scipy.org/mailman/listinfo/numpy-discussion
More information about the NumPy-Discussion
mailing list