n1=500 n2=500 arr=np.random.randn(n1,n2) def normal_py(arr,n1,n2): mxabs=0. for i1 in xrange(n1): for i2 in xrange(n2): val=abs(arr[i1,i2]) if val > mxabs: mxabs=val for i1 in xrange(n1): for i2 in xrange(n2): arr[i1,i2]/=mxabs return arr def normal_np(arr): return arr/abs(arr).max() %timeit -r 3 -n 10 normal_py(arr,n1,n2) %timeit -r 3 -n 10 normal_np(arr) from numba import autojit normal_nb=autojit(normal_py) %timeit -r 3 -n 10 normal_nb(arr,n1,n2) %load_ext cythonmagic %%cython import cython cimport numpy as np @cython.boundscheck(False) @cython.wraparound(False) @cython.nonecheck(False) def normal_cy(np.ndarray[double,ndim=2] arr,int n1,int n2): cdef double val,mxabs=0. cdef int i1,i2 for i1 in xrange(n1): for i2 in xrange(n2): val=abs(arr[i1,i2]) if val > mxabs: mxabs=val for i1 in xrange(n1): for i2 in xrange(n2): arr[i1,i2]/=mxabs return arr %timeit -r 3 -n 10 normal_cy(arr,n1,n2) %%file normal.f90 subroutine normal(arr_out,arr,n1,n2) implicit none integer,intent(in):: n1,n2 real(kind=8),intent(in):: arr(n1,n2) real(kind=8),intent(out):: arr_out(n1,n2) integer i1,i2 real(kind=8):: mxabs,val mxabs=0.d0 do i2=1,n2 do i1=1,n1 val=arr(i1,i2) if(val>mxabs) mxabs=val enddo enddo do i2=1,n2 do i1=1,n1 arr_out(i1,i2)=arr(i1,i2)/mxabs enddo enddo end subroutine subroutine normal_v(arr_out,arr,n1,n2) implicit none integer,intent(in):: n1,n2 real(kind=8),intent(in):: arr(n1,n2) real(kind=8),intent(out):: arr_out(n1,n2) arr_out=arr/maxval(abs(arr)) end subroutine !f2py -c -m normal_f normal.f90 --f90exec=/opt/local/bin/gfortran-mp-4.9 > log.txt import normal_f print normal_f.__doc__ arr_t=arr.T %timeit -r 3 -n 10 normal_f.normal(arr_t) %timeit -r 3 -n 10 normal_f.normal_v(arr_t) r=normal_py(arr,n1,n2) print r.max(),r.min() imshow(r) r=normal_np(arr) print r.max(),r.min() imshow(r) r=normal_nb(arr,n1,n2) print r.max(),r.min() imshow(r) r=normal_cy(arr,n1,n2) print r.max(),r.min() imshow(r) r=normal_f.normal_v(arr_t).T print r.max(),r.min() imshow(r)