将memoryview传递给C函数

20 投票
1 回答
5962 浏览
提问于 2025-04-17 14:03

我有一个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 *'”的错误。有没有办法在不把memoryview转换回numpy数组的情况下,直接传递那个指针给C函数呢?

1 个回答

23

如果底层数据是正确连续/步长的,并且内存中至少有一个元素,那么只需要传递第一个元素的指针(可能还需要长度)就可以了。

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

撰写回答