General Numerical Python question
Mark Jackson
mjackson at alumni.caltech.edu
Fri Oct 17 13:47:08 EDT 2003
More information about the Python-list mailing list
Fri Oct 17 13:47:08 EDT 2003
- Previous message (by thread): General Numerical Python question
- Next message (by thread): General Numerical Python question
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
mcrider at bigfoot.com (2mc) writes: > Michael Ressler <ressler at cheetah.jpl.nasa.gov> wrote in message news:<slrnboqrh1.6mk.ressler at cheetah.jpl.nasa.gov>... > > Another example of thinking things differently is suppose you have a > > vector where the values are randomly positive or negative. Suppose for > > reasons known only to you, you want to replace the negative values > > with the sqrt of their absolute values. With Numeric, no loops are > > involved. > > > > from Numeric import * > > a=array([1.,2.,-3.,4.,-5.,6.,-7.,-8.,9.]) # make up an array > > idx=nonzero(a<0) # indexes of the negative values > > sqrs=sqrt(abs(take(a,idx))) # get the sqrts of neg elements > > put(a,idx,sqrs) # put them back into a > > print a # works! > > > > You can make the whole thing a one-liner if you want to get carried > > away with it. It's too bad "nonzero" isn't called "whereis" or > > something like that - it would make the idx= line more obvious. > > > > Mike > > I think I'm finally getting a handle on this. So, my thanks to > everyone who has so graciously helped me out with their suggestions. > > How would you handle the above if "a" were a 2d array since "nonzero" > only works on 1d arrays? Could you have used the "nonzero" function > on a "vertical" slice of the array (from the perspective of an array > of rows and columns - a vertical slice being the data in the column)? I'm very new at this myself (currently porting some Fortran code to Numeric) but I believe that Numeric.putmask is your friend here: >>> a=Numeric.array([i*(-1)**i for i in range(20)],Numeric.Float) >>> b=a.resize((4,5)) >>> b array([[ 0., -1., 2., -3., 4.], [ -5., 6., -7., 8., -9.], [ 10., -11., 12., -13., 14.], [-15., 16., -17., 18., -19.]]) >>> mask = b<0 >>> mask array([[0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0], [1, 0, 1, 0, 1]]) >>> Numeric.putmask(b, mask, Numeric.sqrt(abs(b))) >>> b array([[ 0. , 1. , 2. , 1.73205081, 4. ], [ 2.23606798, 6. , 2.64575131, 8. , 3. ], [ 10. , 3.31662479, 12. , 3.60555128, 14. ], [ 3.87298335, 16. , 4.12310563, 18. , 4.35889894]]) -- Mark Jackson - http://www.alumni.caltech.edu/~mjackson There are two kinds of fool. One says, "This is old, and therefore good." And one says, "This is new, and therefore better." - Dean William Inge
- Previous message (by thread): General Numerical Python question
- Next message (by thread): General Numerical Python question
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list