📌  相关文章
📜  Cython 的高性能阵列操作 |设置 1

📅  最后修改于: 2022-05-13 01:55:18.497000             🧑  作者: Mango

Cython 的高性能阵列操作 |设置 1

尽管像 NumPy 这样的库可以执行高性能的数组处理函数来对数组进行操作。但是 Cython 也可以很好地工作。但是如何?

代码 #1:Cython函数,用于将值裁剪为简单的一维双精度数组

# 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文件。

代码#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)


完成上述任务后,现在我们可以检查生成的函数剪辑数组的工作情况,其中包含许多不同类型的数组对象。

代码#3:裁剪数组的工作。

# 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))

输出 :

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