High-Performance Array Operations with Cython | Set 1
Last Updated :
29 Mar, 2019
Although libraries like NumPy can perform high-performance array processing functions to operate on arrays. But Cython can also work really well. But how ?
Code #1 : Cython function for clipping the values in a simple 1D array of doubles
cimport cython
@cython .boundscheck( False )
@cython .wraparound( False )
cpdef clip(double[:] a, double min , double max , double[:] out):
if min > max :
raise ValueError( "min must be <= max" )
if a.shape[ 0 ] ! = out.shape[ 0 ]:
raise ValueError( "input and output arrays must be the same size" )
for i in range (a.shape[ 0 ]):
if a[i] < min :
out[i] = min
elif a[i] > max :
out[i] = max
else :
out[i] = a[i]
|
work.py
file is required to compile and build the extension.
Code #2 :
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension(
'sample' ,
[ 'sample.pyx' ])]
setup(name = 'Sample app' ,
cmdclass = { 'build_ext' : build_ext},
ext_modules = ext_modules)
|
After performing the task above, now we can check the working of resulting function clips arrays, with many different kinds of array objects.
Code #3 : Working of Clipping Array.
import work
import array
import numpy
arr = array.array( 'd' , [ 1 , - 3 , 4 , 7 , 2 , 0 ])
print ( "Array : " , arr)
work.clip(arr, 1 , 4 , arr)
print ( "\nClipping array : " , arr)
arr2 = numpy.random.uniform( - 10 , 10 , size = 1000000 )
print ( "\narr2 : \n" , arr2)
arr3 = numpy.zeros_like(arr2)
print ( "\narr3 : \n" , arr3)
work.clip(arr2, - 5 , 5 , arr3)
print ( "\nClipping arr3 : \n" , ar3)
print ( "\nMinimum in arr3 : " , min (arr3))
print ( "\nMaximum in arr3 : " , min (arr3))
|
Output :
Array : array('d', [1.0, -3.0, 4.0, 7.0, 2.0, 0.0])
Clipping array : array('d', [1.0, 1.0, 4.0, 4.0, 2.0, 1.0])
arr2 :
[-9.55546017, 7.45599334, 0.69248932, ..., 0.69583148, -3.86290931, 2.37266888]
arr3 : array([ 0., 0., 0., ..., 0., 0., 0.])
Clipping arr3 :
[-5., 5., 0.69248932, ..., 0.69583148, -3.86290931, 2.37266888]
Minimum in arr3 : 5.0
Maximum in arr3 : 5.0
Share your thoughts in the comments
Please Login to comment...