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
# work.pyx (Cython file) cimport cython @cython .boundscheck( False ) @cython .wraparound( False ) cpdef clip(double[:] a, double min , double max , double[:] out): ''' Clip the values in a to be between min and max. Result in 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 :
# importing libraries 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.
# array module example import work import array import numpy arr = array.array( 'd' , [ 1 , - 3 , 4 , 7 , 2 , 0 ]) print ( "Array : " , arr) # Clipping the array work.clip(arr, 1 , 4 , arr) print ( "\nClipping array : " , arr) # numpy example 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