私は cython が初めてで、既存の C ライブラリ (foolib) をラップするときに numpy 配列の型を定義する必要があるときに少し迷っています。このライブラリは、プラットフォームと 32 ビットまたは 64 ビットでビルドされているかどうかに応じて、int サイズに定義された型を使用します。
の抜粋を次に示しますfoolib.h
。
#include "footypes.h"
...
int foo_zone_read(int fn, int B, int Z, char *zonename, foosize_t *size);
にあるものは次のfootypes.h
とおりです。
# if FOO_BUILD_64BIT
# define FOO_SIZEOF_SIZE 64
typedef long foosize_t;
# else
# define FOO_SIZEOF_SIZE 32
typedef int foosize_t;
# endif
cython ラッパーもあります。cython ヘッダーは次のとおりfoolib.pxd
です。
cdef extern from "foolib.h":
ctypedef int foosize_t
...
int foo_zone_read(int fn, int B, int Z, char *zonename, foosize_t *size)
そして実際の cython ラッパーbar.pyx
:
import numpy
cimport numpy
cimport foolib
...
cdef class pyFOO(object):
def __init__(self, filename)
pass
cpdef zone_read(self, int B, int Z):
cdef char zonename[MAXNAMELENGTH]
cdef int *zsize
cdef int ztype_read
cdef numpy.ndarray[cgsize_t, ndim=1] azsize
コンパイルしようとすると、最後の行で cython エラーが発生します。
cdef numpy.ndarray[cgsize_t, ndim=1] azsize
^
------------------------------------------------------------
bar.pyx:285:31: Invalid type.
C-API numpy リファレンスを読み込もうとしましたが、少し迷っています。私が望むのはasize
、正しい型で入力することだけです。Linuxでは、foolibのコンパイルに応じて、dtype=int32
またはになることを知っています。dtype=int64
次のように配列を作成してasize=numpy.ones(2, dtype=numpy.int64)
いたら、うまくいきましたが、今では型がハードコードされており、それは望ましくありません。
したがって、私の質問は、foottypes.h と numpy 配列の間で何らかの方法で情報を渡すことによって、正しい型を取得する方法です。私の 2 番目の質問は、numpy 配列のサイズを指定する方法です (python 構文で指定する場合は簡単ですが、numpy C-API ではわかりません)。ランタイム条件に応じて、形状 (2) または (6) の配列になることがわかっています。
前もって感謝します。