[英]Cython: Pass a 2D array from Python to a C and retrieve it
我正在尝试使用Cython用书面C语言为相机驱动程序构建包装器。 我是Cython的新手(2周前开始)。 经过大量的努力,我可以成功开发出用于结构,一维数组的包装器,但现在我被二维数组所困扰。
相机的C API之一采用2D数组指针作为输入,并将捕获的图像分配给它。 需要从Python调用此函数,并且需要在Python中处理/显示输出图像。 在浏览了Cython文档和有关堆栈溢出的各种文章之后,我最终感到更加困惑。 我不知道如何在Python和C之间传递2D数组。驱动程序api看起来(有点)像这样:
驱动程序
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
实际上,以上代码是从stack-overflow 帖子中获取的 。 我尝试了其他几种方法,但是都没有用。 请让我知道如何将2D图像导入Python。 提前致谢。
您需要输入i
:
cdef int i
(或者,您可以键入row_size
,它也可以工作)
一旦知道i
是一个int
它就可以计算出tmp_map
索引的类型,因此&
运算符可以工作。
通常,搞清楚像i
这样的循环变量的类型非常好,但是我认为问题在于它无法推断出row_size
的类型,因此它决定不能推断出i
的类型,因为它是从range(row_size)
推导的range(row_size)
。 因此,它无法推断temp_mat[i,0]
的类型。
我怀疑你也同样想更改return语句以return np.array(temp_mat)
-您拥有的代码在大多数情况下可能会工作,但是偶尔np.ascontinuousarray
将不得不进行复制并且mat
不会被更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.