19

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

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

现在我的 cython 包装器代码使用 numpy 数组中的缓冲区语法:

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 函数之前,有什么方法可以在不将 memoryview 强制回 numpy 数组的情况下传递该指针?

4

1 回答 1

22

如果基础数据正确连续/跨步并且内存中至少有一个元素,那么将指针传递给第一个元素(可能还有长度)就足够了:

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
于 2013-01-29T14:44:09.133 回答