# [Numpy-discussion] the fast way to loop over ndarray elements?

Benjamin Root ben.root@ou....
Sat Nov 17 07:40:46 CST 2012

```On Saturday, November 17, 2012, Chao YUE wrote:

> Dear all,
>
> I need to make a linear contrast of the 2D numpy array "data" from an
> interval to another, the approach is:
> I have another two list: "base" & "target", then I check for each ndarray
> element "data[i,j]",
> if   base[m] =< data[i,j] <= base[m+1], then it will be linearly converted
> to be in the interval of (target[m], target[m+1]),
> using another function called "lintrans".
>
>
> #The way I do is to loop each row and column of the 2D array, and finally
> loop the intervals constituted by base list:
>
> for row in range(data.shape[0]):
>     for col in range(data.shape[1]):
>         for i in range(len(base)-1):
>             if data[row,col]>=base[i] and data[row,col]<=base[i+1]:
>
> data[row,col]=lintrans(data[row,col],(base[i],base[i+1]),(target[i],target[i+1]))
>                 break  #use break to jump out of loop as the data have to
> be ONLY transferred ONCE.
>
>
> Now the profiling result shows that most of the time has been used in this
> loop over the array ("plot_array_transg"),
> and less time in calling the linear transformation fuction "lintrans":
>
>    ncalls     tottime  percall    cumtime    percall
> filename:lineno(function)
>   18047    0.110    0.000      0.110        0.000
> mathex.py:132(lintrans)
>   1            12.495  12.495   19.061      19.061
> mathex.py:196(plot_array_transg)
>
>
> so is there anyway I can speed up this loop?  Thanks for any suggestions!!
>
> best,
>
> Chao
>
>
If the values in base are ascending, you can use searchsorted() to find out
where values from data can be placed into base while maintaining order.
Don't know if it is faster, but it would certainly be easier to read.

Cheers!
Ben Root
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/numpy-discussion/attachments/20121117/c0aa7046/attachment.html
```