我是 cython 的新手,当我需要在包装现有 C 库(foolib)时为我的 numpy 数组定义一个类型时,我有点迷茫。该库使用定义的类型作为 int 大小,具体取决于平台以及它是用 32 位还是 64 位构建的。
以下是其中一段摘录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 上它会dtype=int32
或dtype=int64
取决于傻瓜的编译。如果我会像这样创建数组:asize=numpy.ones(2, dtype=numpy.int64)
它会工作,但现在类型是硬编码的,我不希望那样。
所以我的问题是如何通过在 footypes.h 和 numpy 数组之间传递信息来获得正确的类型。我的第二个问题是如何指定我的 numpy 数组的大小(如果我用 python 语法来做这很容易,但是使用 numpy C-API 我不清楚)。我知道它可以是形状 (2) 或 (6) 的数组,具体取决于运行时条件。
提前致谢。