使用 Cython 包装 C++ 模板以接受任何 numpy 数组
Using Cython to wrap a c++ template to accept any numpy array
我正在尝试将用 C++ 编写的并行排序包装为模板,以便将其与任何数字类型的 numpy 数组一起使用。我正在尝试使用 Cython 来执行此操作。
我的问题是我不知道如何将指向 numpy 数组数据(正确类型)的指针传递给 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])
我正在尝试将用 C++ 编写的并行排序包装为模板,以便将其与任何数字类型的 numpy 数组一起使用。我正在尝试使用 Cython 来执行此操作。
我的问题是我不知道如何将指向 numpy 数组数据(正确类型)的指针传递给 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])