Open In App

High-Performance Array Operations with Cython | Set 1

Last Updated : 29 Mar, 2019
Improve
Improve
Like Article
Like
Save
Share
Report

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


Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads