Высокопроизводительные операции с массивами с помощью Cython | Комплект 1

Опубликовано: 12 Апреля, 2022

Хотя библиотеки, такие как NumPy, могут выполнять высокопроизводительные функции обработки массивов для работы с массивами. Но Cython также может работать очень хорошо. Но как ?

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)


После выполнения вышеуказанной задачи теперь мы можем проверить работу результирующих массивов клипов функций с множеством различных типов объектов массивов.

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 (" Clipping array : ", arr)
  
# numpy example
arr2 = numpy.random.uniform(-10, 10, size = 1000000)
print (" arr2 : ", arr2)
  
arr3 = numpy.zeros_like(arr2)
print (" arr3 : ", arr3)
  
work.clip(arr2, -5, 5, arr3)
print (" Clipping arr3 : ", ar3)
print (" Minimum in arr3 : ", min(arr3))
print (" Maximum in arr3 : ", min(arr3))

Выход :

Массив: array ('d', [1.0, -3.0, 4.0, 7.0, 2.0, 0.0])

Массив отсечения: 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.])

Обрезка arr3: 
[-5., 5., 0,69248932, ..., 0,69583148, -3,86290931, 2,37266888]

Минимум в arr3: 5.0

Максимум в arr3: 5.0

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.