Python 使用Cython包装一个c++;模板以接受任何numpy数组

Python 使用Cython包装一个c++;模板以接受任何numpy数组,python,c++,arrays,numpy,cython,Python,C++,Arrays,Numpy,Cython,我试图用C++编写一个并行排序,将其与任何数字类型的NUMPY数组一起使用。我想用Cython来做这件事 我的问题是,我不知道如何将指针(正确类型的)的NUPY数组数据传递给C++模板。我相信我应该使用融合的数据类型,但我不太明白怎么做 .pyx文件中的代码如下所示 # importing c++ template cdef extern from "test.cpp": void inPlaceParallelSort[T](T* arrayPointer,int arrayLengt

我试图用C++编写一个并行排序,将其与任何数字类型的NUMPY数组一起使用。我想用Cython来做这件事

我的问题是,我不知道如何将指针(正确类型的)的NUPY数组数据传递给C++模板。我相信我应该使用融合的数据类型,但我不太明白怎么做

.pyx文件中的代码如下所示

# importing c++ template
cdef extern from "test.cpp":
    void inPlaceParallelSort[T](T* arrayPointer,int arrayLength)

def sortNumpyArray(np.ndarray a):
    # This obviously will not work, but I don't know how to make it work. 
    inPlaceParallelSort(a.data, len(a))

过去,我在所有可能的数据类型上使用丑陋for循环执行类似的任务,但我相信应该有更好的方法来完成这项任务

是的,您希望使用融合类型让Cython调用排序模板以实现模板的适当专门化。 下面是一个适用于所有非复杂数据类型的工作示例,它通过
std::sort
实现这一点

# cython: wraparound = False
# cython: boundscheck = False

cimport cython

cdef extern from "<algorithm>" namespace "std":
    cdef void sort[T](T first, T last) nogil

ctypedef fused real:
    cython.char
    cython.uchar
    cython.short
    cython.ushort
    cython.int
    cython.uint
    cython.long
    cython.ulong
    cython.longlong
    cython.ulonglong
    cython.float
    cython.double

cpdef void npy_sort(real[:] a) nogil:
    sort(&a[0], &a[a.shape[0]-1])
#cython:wrapparound=False
#cython:boundscheck=False
西姆波特赛顿酒店
来自“命名空间”std的cdef外部:
cdef void sort[T](T first,T last)nogil
ctypedef fused real:
赛顿·查尔
西顿·乌查尔
赛顿·肖特
西顿·乌舒特
cython.int
西顿
赛顿·朗
西顿·乌隆
赛顿·隆隆
黄龙
赛顿浮球
赛顿双人
cpdef无效npy_排序(实[:]a)编号:
排序(&a[0],&a[a.shape[0]-1])

这没有按原样编译,编译器对nogil抱怨了很多。我不得不杀死它,但是没有它并行化就可以工作了。@Maximakaev是的,只有当你想在并行循环中调用Cython函数时,nogil才是真正必要的。没有它,排序函数中的并行化应该很好。奇怪的是,它不会在那里编译。Cython版本可能有些不同。我有一个最新的开发版本(非常类似于0.22),它对我来说运行良好。