python - 使用 Cython 包装 C++ 模板以接受任何 numpy 数组

标签 python c++ arrays numpy cython

我正在尝试将用 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))

过去,我对所有可能的 dtype 使用丑陋的 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])

关于python - 使用 Cython 包装 C++ 模板以接受任何 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28638094/

相关文章:

java - 如何在Python中编写可以在Java中本地读取的浮点值?

c++ - 具有链接时代码生成的 MSVC 能否跨 C 和 C++ 进行优化?

c++ - 为什么我得到 realloc() invalid old size?

c# - 是否可以为自定义结构重载 "array assignment"?

javascript - 在javascript中在 Canvas 中生成随机图像

python - Python中nan和 'nan'的区别

python - Pygame圆碰撞?

python - 更好的素数算法

c++ - Valgrind Massif工具部队快照

c - 更新嵌套 C 结构数组的正确方法是什么?