在用cython包装现有C库时定义numpy数组的数据类型

2024-10-01 02:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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中的内容:

^{pr2}$

我还有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或{},这取决于foolib的编译。如果我创建这样的数组:asize=numpy.ones(2, dtype=numpy.int64)它本来可以工作的,但是现在类型是硬编码的,我不想这样。在

我的问题是如何在数组之间传递信息。 我的第二个问题是如何指定numpy数组的大小(如果我用python语法来指定,这很容易,但是对于numpyc-API,我不太清楚)。我知道它可以是形状(2)或(6)的数组,具体取决于运行时的条件。在

提前谢谢。在


Tags: numpyzone类型read定义foo数组cython