fla*_*zzi 17 python numpy cython
我有一个C函数声明如下:
void getIndexOfState(long *p, long C, long G, long B, long *state);
Run Code Online (Sandbox Code Playgroud)
现在我的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
Run Code Online (Sandbox Code Playgroud)
我想使用新的memoryview语法,我的问题是,在使用memoryview时如何将指针传递给数据?
我试过了:
cpdef int getIndexOfState(self, long[:] s):
cdef long out
getIndexOfState(&out, self.C, self.G, self.B, s)
return out
Run Code Online (Sandbox Code Playgroud)
当我试图编译模块时,它引发了"无法将类型'long [:]'分配给'long*'"错误.在调用C函数之前,有没有办法传递该指针而不将内存视图强制回到numpy数组?
Fre*_*Foo 19
如果底层数据是正确连续/跨步的并且内存中至少有一个元素,那么将指针传递给第一个元素(可能是长度)应该足够了:
getIndexOfState(&out, self.C, self.G, self.B, &s[0])
Run Code Online (Sandbox Code Playgroud)
编辑:
确保"正确连续"的一种方法应该是添加"[:: 1]".
cpdef int getIndexOfState(self, long[::1] s):
cdef long out
getIndexOfState(&out, self.C, self.G, self.B, &s[0])
return out
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3479 次 |
| 最近记录: |