In [1]:
n1=500
n2=500
arr=np.random.randn(n1,n2)
In [2]:
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()
In [3]:
%timeit -r 3 -n 10 normal_py(arr,n1,n2)
In [4]:
%timeit -r 3 -n 10 normal_np(arr)
In [5]:
from numba import autojit
normal_nb=autojit(normal_py)
In [6]:
%timeit -r 3 -n 10 normal_nb(arr,n1,n2)
In [1]:
%load_ext cythonmagic
In [2]:
%%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
In [9]:
%timeit -r 3 -n 10 normal_cy(arr,n1,n2)
In [10]:
%%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
In [11]:
!f2py -c -m normal_f normal.f90 --f90exec=/opt/local/bin/gfortran-mp-4.9 > log.txt
In [12]:
import normal_f
print normal_f.__doc__
In [13]:
arr_t=arr.T
In [14]:
%timeit -r 3 -n 10 normal_f.normal(arr_t)
In [15]:
%timeit -r 3 -n 10 normal_f.normal_v(arr_t)
In [16]:
r=normal_py(arr,n1,n2)
print r.max(),r.min()
imshow(r)
Out[16]:
In [17]:
r=normal_np(arr)
print r.max(),r.min()
imshow(r)
Out[17]:
In [18]:
r=normal_nb(arr,n1,n2)
print r.max(),r.min()
imshow(r)
Out[18]:
In [19]:
r=normal_cy(arr,n1,n2)
print r.max(),r.min()
imshow(r)
Out[19]:
In [20]:
r=normal_f.normal_v(arr_t).T
print r.max(),r.min()
imshow(r)
Out[20]:
In [20]: