Cythonの2つのタイプにC ++でテンプレート化された関数を使用するにはどうすればよいですか?

チエル

テンプレート化されたC ++関数があり、両方のタイプを使用できるようにしたいと考えています。Pythonはオーバーロードをサポートしていないので、これを解決する方法が少し行き詰まっています。私は.pyx以下に示すように持っています。どのように私は両方でC ++の関数を使用することができますfloatし、double

import cython
import numpy as np
cimport numpy as np

# declare the interface to the C code
cdef extern from "diff_cpp.cpp" namespace "diff":
    cdef void diff_cpp[float] (float* at, const float* a, const float visc,
                               const float dxidxi, const float dyidyi, const float dzidzi,
                               const int itot, const int jtot, const int ktot)

cdef extern from "diff_cpp.cpp" namespace "diff":
    cdef void diff_cpp[double] (double* at, const double* a, const double visc,
                                const double dxidxi, const double dyidyi, const double dzidzi,
                                const int itot, const int jtot, const int ktot)

@cython.boundscheck(False)
@cython.wraparound(False)
def diff(np.ndarray[double, ndim=3, mode="c"] at not None,
         np.ndarray[double, ndim=3, mode="c"] a not None,
         double visc, double dxidxi, double dyidyi, double dzidzi):
    cdef int ktot, jtot, itot
    ktot, jtot, itot = at.shape[0], at.shape[1], at.shape[2]
    diff_cpp[double](&at[0,0,0], &a[0,0,0], visc, dxidxi, dyidyi, dzidzi, itot, jtot, ktot)
    return None

@cython.boundscheck(False)
@cython.wraparound(False)
def diff_f(np.ndarray[float, ndim=3, mode="c"] at not None,
           np.ndarray[float, ndim=3, mode="c"] a not None,
           float visc, float dxidxi, float dyidyi, float dzidzi):
    cdef int ktot, jtot, itot
    ktot, jtot, itot = at.shape[0], at.shape[1], at.shape[2]
    diff_cpp[float](&at[0,0,0], &a[0,0,0], visc, dxidxi, dyidyi, dzidzi, itot, jtot, ktot)
    return None

ソリューションで更新

@ oz1の答えは、これを行う正しい方法を提供しました。これは、この特定の問題の解決策に関心のある人のために機能するコードです。

import cython
import numpy as np
cimport numpy as np

# declare the interface to the C code
cdef extern from "diff_cpp.cpp" namespace "diff":
    cdef void diff_cpp[T](T* at, const T* a, const T visc,
                          const T dxidxi, const T dyidyi, const T dzidzi,
                          const int itot, const int jtot, const int ktot)

ctypedef fused float_t:
    cython.float
    cython.double

@cython.boundscheck(False)
@cython.wraparound(False)
def diff(np.ndarray[float_t, ndim=3, mode="c"] at not None,
         np.ndarray[float_t, ndim=3, mode="c"] a not None,
         float_t visc, float_t dxidxi, float_t dyidyi, float_t dzidzi):
    cdef int ktot, jtot, itot
    ktot, jtot, itot = at.shape[0], at.shape[1], at.shape[2]
    diff_cpp(&at[0,0,0], &a[0,0,0], visc, dxidxi, dyidyi, dzidzi, itot, jtot, ktot)
    return None
oz1

2つのメモ:

  1. Cythonはc ++テンプレートをサポートしています(http://docs.cython.org/en/latest/src/userguide/wrapping_CPlusPlus.html
  2. Cythonには融合型があります(http://docs.cython.org/en/latest/src/userguide/fusedtypes.html

例:

// lib.cpp
template<typename T>
T arr_sum(T *arr, size_t size)
{
    T temp=0;
    for (size_t i=0; i != size; ++i){
        temp += arr[i];
    }
    return temp;
}

# lib_wrapper.pyx
cimport cython

ctypedef fused  float_t:
    cython.float
    cython.double

cdef extern from "lib.cpp" nogil:
    T arr_sum[T](T *arr, size_t size)

def py_arr_sum(float_t[:] arr not None):
    print(sizeof(arr[0]))  # check the element size
    return arr_sum(&arr[0], arr.shape[0])

# use.py
import numpy as np
from lib_wrapper import py_arr_sum

print(py_arr_sum(np.array([1,2,3], dtype=np.float32)))
print(py_arr_sum(np.array([1,2,3], dtype=np.float64)))
print(py_arr_sum(np.array([1,2,3], dtype=np.int32)))  # oops

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

static_assertを使用して、テンプレート化された関数へのイテレーター引数の要素タイプを確認するにはどうすればよいですか?

分類Dev

すでに推定されているテンプレート関数へのポインタを取得するにはどうすればよいですか?

分類Dev

テンプレート化されたクラスを引数の型として使用するにはどうすればよいですか?

分類Dev

テンプレート化された関数の引数としてstd :: getを渡すにはどうすればよいですか?

分類Dev

テンプレートでstd関数を使用するにはどうすればよいですか?

分類Dev

同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

分類Dev

関数テンプレートの特殊化を減らすにはどうすればよいですか?

分類Dev

(テンプレートパラメータで使用される)型を返すconstexpr関数を作成するにはどうすればよいですか?

分類Dev

関数テンプレートで使用される関数を定義するにはどうすればよいですか?

分類Dev

パラメータ化された関数内でオブジェクトプロパティを使用するにはどうすればよいですか?

分類Dev

テンプレート関数をテンプレート化されたネストされたクラスのフレンドとして宣言するにはどうすればよいですか?

分類Dev

テンプレートヘルパー関数で計算された値を保存し、それらを別のテンプレート関数で使用するにはどうすればよいですか?

分類Dev

メンバー関数テンプレートのインスタンス化を削除するにはどうすればよいですか?

分類Dev

Symfony MailerのBootstrapでテンプレート化されたメールを使用するにはどうすればよいですか?

分類Dev

C ++ 03で、インスタンス化されたテンプレート関数のアドレスを参照するにはどうすればよいですか?

分類Dev

C ++の別のテンプレート関数でテンプレートクラスに属するネストされた型を使用するにはどうすればよいですか?

分類Dev

C ++仮想クラスのテンプレート化された子からデータを取得するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

Azure ResourceManagerテンプレートでAzureB2Cを使用するようにAzure関数を構成するにはどうすればよいですか?

分類Dev

C ++でテンプレート関数インスタンスのショートカットを作成するにはどうすればよいですか?

分類Dev

テンプレート引数が与えられた場合、これが実際にパラメータ化されたテンプレートクラスであるかどうかを確認するにはどうすればよいですか?

分類Dev

C ++関数テンプレートの簡略化されたインターフェイスを実現するにはどうすればよいですか?

分類Dev

コンパイラがテンプレート化されたget関数の正しい戻り型を推測できるようにするにはどうすればよいですか?

分類Dev

さまざまなテンプレートタイプのハッシュ関数を作成するにはどうすればよいですか?

分類Dev

XHR onProgress関数でデフレート/ gzip圧縮されたコンテンツを使用するにはどうすればよいですか?

分類Dev

異なるタイプを返すように設計されたテンプレート関数をどのように特殊化できますか?

分類Dev

テンプレート化されたメンバー関数の特殊なバリアントへのポインターを作成するにはどうすればよいですか?

分類Dev

クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

Related 関連記事

  1. 1

    static_assertを使用して、テンプレート化された関数へのイテレーター引数の要素タイプを確認するにはどうすればよいですか?

  2. 2

    すでに推定されているテンプレート関数へのポインタを取得するにはどうすればよいですか?

  3. 3

    テンプレート化されたクラスを引数の型として使用するにはどうすればよいですか?

  4. 4

    テンプレート化された関数の引数としてstd :: getを渡すにはどうすればよいですか?

  5. 5

    テンプレートでstd関数を使用するにはどうすればよいですか?

  6. 6

    同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

  7. 7

    関数テンプレートの特殊化を減らすにはどうすればよいですか?

  8. 8

    (テンプレートパラメータで使用される)型を返すconstexpr関数を作成するにはどうすればよいですか?

  9. 9

    関数テンプレートで使用される関数を定義するにはどうすればよいですか?

  10. 10

    パラメータ化された関数内でオブジェクトプロパティを使用するにはどうすればよいですか?

  11. 11

    テンプレート関数をテンプレート化されたネストされたクラスのフレンドとして宣言するにはどうすればよいですか?

  12. 12

    テンプレートヘルパー関数で計算された値を保存し、それらを別のテンプレート関数で使用するにはどうすればよいですか?

  13. 13

    メンバー関数テンプレートのインスタンス化を削除するにはどうすればよいですか?

  14. 14

    Symfony MailerのBootstrapでテンプレート化されたメールを使用するにはどうすればよいですか?

  15. 15

    C ++ 03で、インスタンス化されたテンプレート関数のアドレスを参照するにはどうすればよいですか?

  16. 16

    C ++の別のテンプレート関数でテンプレートクラスに属するネストされた型を使用するにはどうすればよいですか?

  17. 17

    C ++仮想クラスのテンプレート化された子からデータを取得するにはどうすればよいですか?

  18. 18

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  19. 19

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  20. 20

    Azure ResourceManagerテンプレートでAzureB2Cを使用するようにAzure関数を構成するにはどうすればよいですか?

  21. 21

    C ++でテンプレート関数インスタンスのショートカットを作成するにはどうすればよいですか?

  22. 22

    テンプレート引数が与えられた場合、これが実際にパラメータ化されたテンプレートクラスであるかどうかを確認するにはどうすればよいですか?

  23. 23

    C ++関数テンプレートの簡略化されたインターフェイスを実現するにはどうすればよいですか?

  24. 24

    コンパイラがテンプレート化されたget関数の正しい戻り型を推測できるようにするにはどうすればよいですか?

  25. 25

    さまざまなテンプレートタイプのハッシュ関数を作成するにはどうすればよいですか?

  26. 26

    XHR onProgress関数でデフレート/ gzip圧縮されたコンテンツを使用するにはどうすればよいですか?

  27. 27

    異なるタイプを返すように設計されたテンプレート関数をどのように特殊化できますか?

  28. 28

    テンプレート化されたメンバー関数の特殊なバリアントへのポインターを作成するにはどうすればよいですか?

  29. 29

    クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

ホットタグ

アーカイブ