c ++で記述された並列ソートをテンプレートとしてラップし、任意の数値型のnumpy配列で使用しようとしています。Cythonを使用してこれを実行しようとしています。
私の問題は、(正しいタイプの)numpy配列データへのポインターをc ++テンプレートに渡す方法がわからないことです。これには融合dtypeを使用する必要があると思いますが、その方法がよくわかりません。
.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])
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加