将memoryview传递给C函数

时间:2013-01-29 13:45:48

标签: python numpy cython

我有一个C函数声明如下:

void getIndexOfState(long *p, long C, long G, long B, long *state);

现在我的cython包装器代码使用来自numpy array的缓冲区语法:

cpdef int getIndexOfState(self, np.ndarray[np.int_t, ndim=1, mode="c"] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, <long*> s.data)
    return out

我想使用新的memoryview语法,我的问题是,如何在使用memoryview时将指针传递给数据?

我试过了:

cpdef int getIndexOfState(self, long[:] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, s)
    return out

在我尝试编译模块时引发了“无法将类型'long [:]'分配给'long *'”错误。在调用C函数之前,有没有办法传递该指针而不将内存视图强制回到numpy数组?

1 个答案:

答案 0 :(得分:18)

如果底层数据是properly contiguous/strided并且内存中至少有一个元素,那么将指针传递给第一个元素(可能是长度)就足够了:

getIndexOfState(&out, self.C, self.G, self.B, &s[0])

编辑:

确保“正确连续”的一种方法应该是添加“[:: 1]”。

cpdef int getIndexOfState(self, long[::1] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, &s[0])
    return out