【发布时间】:2017-07-12 17:43:33
【问题描述】:
我正在尝试使用 Cython 以书面 C 语言为相机驱动程序构建一个包装器。我是 Cython 的新手(2 周前开始)。经过一番努力,我可以成功地为结构、一维数组开发包装器,但现在我被二维数组困住了。
其中一个相机的 C API 将 2D 数组指针作为输入并将捕获的图像分配给它。此函数需要从 Python 调用,并且输出图像需要在 Python 中处理/显示。在浏览了 Cython 文档和有关 stack-overflow 的各种帖子之后,我最终感到更加困惑。我不知道如何在 Python 和 C 之间传递二维数组。驱动程序 api 看起来(有点)像这样:
驱动程序.h
void assign_values2D(double **matrix, unsigned int row_size, unsigned int column_size);
c_driver.pyd
cdef extern from "driver.h":
void assign_values2D(double **matrix, unsigned int row_size, unsigned int column_size)
test.pyx
from c_driver import assign_values2D
import numpy as np
cimport numpy as np
cimport cython
from libc.stdlib cimport malloc, free
import ctypes
@cython.boundscheck(False)
@cython.wraparound(False)
def assignValues2D(self, np.ndarray[np.double_t,ndim=2,mode='c']mat):
row_size,column_size = np.shape(mat)
cdef np.ndarray[double, ndim=2, mode="c"] temp_mat = np.ascontiguousarray(mat, dtype = ctypes.c_double)
cdef double ** mat_pointer = <double **>malloc(column_size * sizeof(double*))
if not mat_pointer:
raise MemoryError
try:
for i in range(row_size):
mat_pointer[i] = &temp_mat[i, 0]
assign_values2D(<double **> &mat_pointer[0], row_size, column_size)
return np.array(mat)
finally:
free(mat_pointer)
test_camera.py
b = np.zeros((5,5), dtype=np.float) # sample code
print "B Before = "
print b
assignValues2D(b)
print "B After = "
print b
编译的时候报错:
Error compiling Cython file:
------------------------------------------------------------
...
if not mat_pointer:
raise MemoryError
try:
for i in range(row_size):
mat_pointer[i] = &temp_mat[i, 0]
^
------------------------------------------------------------
test.pyx:120:21: Cannot take address of Python variable
事实上,上面的代码取自堆栈溢出post。我尝试了其他几种方法,但都没有奏效。请让我知道如何将 2D 图像导入 Python。提前致谢。
【问题讨论】:
-
我的猜测是,这可能不是编译给出的第一个错误消息,而早期的错误消息可能会提供更多信息。
-
但问题可能在于
tmp_mat被定义为np.ndarray[double...而不是np.ndarray[np.double_t... -
感谢@DavidW 的快速响应。没有早期的编译器错误。
-
我试过
np.ndarray[np.double_t...],它给出了相同的编译器错误信息 -
我的猜测(没有尝试代码)是错误的。现在找到真正的问题...
标签: python multidimensional-array cython wrapper