在这个网站上有很多关于在cython中使用numpy的问题,其中一个特别有用的问题是Simple wrapping of C code with cython。
然而,cython/numpy接口api 似乎已经有所改变,尤其是确保传递内存连续数组方面。
编写一个在cython中使用以下方式包装函数的最佳方法:
- 获取一个numpy数组,该数组可能是但不一定是连续的
- 调用具有签名
double* data_in, double* data_out
的C ++类方法 - 返回方法写入的
double*
的numpy数组?
我的尝试如下:
cimport numpy as np
import numpy as np # as suggested by jorgeca
cdef extern from "myclass.h":
cdef cppclass MyClass:
MyClass() except +
void run(double* X, int N, int D, double* Y)
def run(np.ndarray[np.double_t, ndim=2] X):
cdef int N, D
N = X.shape[0]
D = X.shape[1]
cdef np.ndarray[np.double_t, ndim=1, mode="c"] X_c
X_c = np.ascontiguousarray(X, dtype=np.double)
cdef np.ndarray[np.double_t, ndim=1, mode="c"] Y_c
Y_c = np.ascontiguousarray(np.zeros((N*D,)), dtype=np.double)
cdef MyClass myclass
myclass = MyClass()
myclass.run(<double*> X_c.data, N, D, <double*> Y_c.data)
return Y_c.reshape(N, 2)
这段代码可以编译,但不一定是最优的。你有没有对上面代码片段进行改进的建议?
同时,当在运行时调用该代码时,会抛出并显示“np未定义于第X_c行”,请注意(2)。具体的测试代码和错误信息如下:
import numpy as np
import mywrapper
mywrapper.run(np.array([[1,2],[3,4]], dtype=np.double))
# NameError: name 'np' is not defined [at mywrapper.pyx":X_c = ...]
# fixed!
.pyx
文件中仍需导入import numpy as np
才能使用NumPy函数(cimport numpy as np
用于导入有关NumPy模块的特殊编译时信息)。 - jorgeca