在这个网站上有很多关于在 cython 中使用 numpy 的问题,一个特别有用的问题是Simple wrapping of C code with cython。
但是,cython/numpy 接口 api似乎发生了一些变化,特别是在确保内存连续数组的传递方面。
在 cython 中编写包装函数的最佳方法是:
- 采用一个可能但不一定连续的 numpy 数组
- 调用带有签名的 C++ 类方法
double* data_in, double* data_out
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)
此代码可以编译,但不一定是最佳的。您对改进上面的代码段有什么建议吗?
X_c = ...
(2)在运行时调用它时抛出和“np is not defined on line ”)。确切的测试代码和错误信息如下:
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!