[Numpy-discussion] fancy indexing/broadcasting question

Anne Archibald peridot.faceted at gmail.com
Sat Jul 7 15:13:59 EDT 2007


On 07/07/07, Mark.Miller <mpmusu at cc.usu.edu> wrote:
> A quick question for the group.  I'm working with some code to generate
> some arrays of random numbers.  The random numbers, however, need to
> meet certain criteria.  So for the moment, I have things that look like
> this (code is just an abstraction):
>
> import numpy
> normal=numpy.random.normal
>
> RNDarray = normal(25,15,(50,50))
> tmp1 = (RNDarray < 0) | (RNDarray > 25)
> while tmp1.any():
>      print tmp1.size, tmp1.shape, tmp1[tmp1].size
>      RNDarray[tmp1] = normal(5,3, size = RNDarray[tmp1].size)
>      tmp1 = (RNDarray < 0) | (RNDarray > 25)
>
> This code works well.  However, it might be considered inefficient
> because, for each iteration of the while loop, all values get
> reevaluated even if they have previously met the criteria encapsulated
> in tmp1.  It would be better if, for each cycle of the while loop, only
> those elements that have previously not met criteria get reevaluated.

You can write a quick recursive function to do it:
In [33]: def gen_condition(n):
   ....:     A = normal(size=n)
   ....:     c = abs(A)>1
   ....:     subn = sum(c)
   ....:     if subn>0:
   ....:         A[c] = gen_condition(subn)
   ....:     return A
   ....:
Probably not ideal if it's going to take many tries, but it's pretty clear.

Anne



More information about the NumPy-Discussion mailing list