在这个网站上有很多关于在cython中使用numpy的问题,特别有用的问题是Simple wrapping of C code with cython。通过Cython传递和返回numpy数组到C++方法
但是,cython/numpy接口API seems to have changed a bit,特别是确保传递内存连续数组。
什么是用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)
此代码编译,但并不一定是最优的。你有什么建议来改进上面的代码片段吗?
(2)抛出并且“np未在行X_c = ...
上定义”)在运行时调用它时。 确切的测试代码和错误消息如下:
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!
你仍然需要进口'作为numpy的在np'你'.pyx'文件使用numpy的功能('cimport numpy的作为np' [ “用于导入关于numpy模块的特殊编译时信息”](http://docs.cython.org/src/tutorial/numpy.html#adding-types))。 – jorgeca
@jorgeca我想你的评论回答OP的问题... –
@SaulloCastro我发布它作为评论,因为我认为这是一个小的障碍,但我不知道什么是写这些接口的最佳方式。 – jorgeca