1

我是 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=int32dtype=int64取决于傻瓜的编译。如果我会像这样创建数组:asize=numpy.ones(2, dtype=numpy.int64)它会工作,但现在类型是硬编码的,我不希望那样。

所以我的问题是如何通过在 footypes.h 和 numpy 数组之间传递信息来获得正确的类型。我的第二个问题是如何指定我的 numpy 数组的大小(如果我用 python 语法来做这很容易,但是使用 numpy C-API 我不清楚)。我知道它可以是形状 (2) 或 (6) 的数组,具体取决于运行时条件。

提前致谢。

4

0 回答 0