Hi Troels, For even faster code , have a look at:
https://stackoverflow.com/questions/6431973/how-to-copy-data-from-a-numpy-array-to-another Regards, Edward On 19 May 2014 00:51, <[email protected]> wrote: > Author: tlinnet > Date: Mon May 19 00:51:18 2014 > New Revision: 23219 > > URL: http://svn.gna.org/viewcvs/relax?rev=23219&view=rev > Log: > Speed-up of model TSMFK01. > > task #7793: (https://gna.org/task/?7793) Speed-up of dispersion models. > > This is won by not checking single values in the R2eff array for math domain > errors, but calculating all steps, and in one single round check for finite > values. > If just one non-finite value is found, the whole array is returned with a > large > penalty of 1e100. > > This makes all calculations be the fastest numpy array way. > > Modified: > branches/disp_speed/lib/dispersion/tsmfk01.py > > Modified: branches/disp_speed/lib/dispersion/tsmfk01.py > URL: > http://svn.gna.org/viewcvs/relax/branches/disp_speed/lib/dispersion/tsmfk01.py?rev=23219&r1=23218&r2=23219&view=diff > ============================================================================== > --- branches/disp_speed/lib/dispersion/tsmfk01.py (original) > +++ branches/disp_speed/lib/dispersion/tsmfk01.py Mon May 19 00:51:18 > 2014 > @@ -67,7 +67,7 @@ > """ > > # Python module imports. > -from math import sin > +from numpy import sin, isfinite, sum > > > def r2eff_TSMFK01(r20a=None, dw=None, k_AB=None, tcp=None, back_calc=None, > num_points=None): > @@ -90,24 +90,20 @@ > @type num_points: int > """ > > - # Loop over the time points, back calculating the R2eff values. > + # Denominator. > + denom = dw * tcp > + > + # The numerator. > + numer = sin(denom) > + > + # Calculate R2eff. > + R2eff = r20a + k_AB - k_AB * numer / denom > + > + # Catch errors, taking a sum over array is the fastest way to check for > + # +/- inf (infinity) and nan (not a number). > + if not isfinite(sum(R2eff)): > + R2eff = array([1e100]*num_points) > + > + # Parse back the value to update the back_calc class object. > for i in range(num_points): > - # Denominator. > - denom = dw * tcp[i] > - > - # The numerator. > - numer = sin(denom) > - > - # Catch zeros (to avoid pointless mathematical operations). > - if numer == 0.0: > - back_calc[i] = r20a + k_AB > - continue > - > - # Avoid divide by zero. > - if denom == 0.0: > - back_calc[i] = 1e100 > - continue > - > - # The full formula. > - else: > - back_calc[i] = r20a + k_AB - k_AB * numer / denom > + back_calc[i] = R2eff[i] > > > _______________________________________________ > relax (http://www.nmr-relax.com) > > This is the relax-commits mailing list > [email protected] > > To unsubscribe from this list, get a password > reminder, or change your subscription options, > visit the list information page at > https://mail.gna.org/listinfo/relax-commits _______________________________________________ relax (http://www.nmr-relax.com) This is the relax-devel mailing list [email protected] To unsubscribe from this list, get a password reminder, or change your subscription options, visit the list information page at https://mail.gna.org/listinfo/relax-devel

