On Tue, Feb 10, 2009 at 12:28 PM, Keith Goodman <[email protected]> wrote:
> On Tue, Feb 10, 2009 at 12:18 PM, Keith Goodman <[email protected]> wrote:
>> On Tue, Feb 10, 2009 at 11:29 AM, Mark Janikas <[email protected]> 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
_______________________________________________
Numpy-discussion mailing list
[email protected]
http://projects.scipy.org/mailman/listinfo/numpy-discussion