1

私は 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) の配列になることがわかっています。

前もって感謝します。

4

0 に答える 0