正确的方法将numpy.matrix转换为C双指针

将numpy矩阵作为参数传递给C函数采用双指针的规范方法是什么?

上下文 :我使用numpyvalidation一些C代码 – 我有一个C函数,它接受const double ** const ,我使用ctypes从Python调用.so

我试过了:

 func.argtypes = ctypeslib.ndpointer(dtype=double, ndim=2, flags="C_CONTIGUOUS") 

直接传递numpy矩阵(不起作用),以及

 func.argtypes = ctypes.POINTER(ctypes.POINTER(ctypes.c_double)) 

然后通过各种演员numpy传递numpy矩阵。 Casting导致了Python错误

 TypeError: _type_ must have storage info 

注意 :这个问题在几年前出现在这里 ,但没有完全成功的解决方案。

我想你正在寻找numpy的ndarray (或者matrix )中的ctypes接口。 您可以在这里查看有关numpy手册的更多信息 。

请注意,numpy C-API使用单个指针存储ndarray (或矩阵)(请参阅http://docs.scipy.org/doc/numpy/reference/c-api.types-and-structures.html #c.PyArrayObject )。 你不能将这个单指针转换成C中的双指针,因为它们是不同的类型。 此外,numpy不仅将数据存储在这些对象上,还存储有关矩阵形状和步幅的信息(数据如何在提供的数据指针上组织)。 如果不了解所有这些信息,您的代码将无法在所有条件下运行。 例如,如果在将矩阵与代码连接之前转置矩阵,则会得到意想不到的结果!

根据您的设置,有几种解决方案:

  1. 如果您可以修改库的API,请对其进行更改,以便您不仅可以传递有关数据指针的信息,还可以传递矩阵的形状及其步幅。 然后,使用上面的链接来确定如何使用新API连接numpy / ctypes支持。

  2. 如果你不能修改你的API,我建议你创建一个基于ctypes的Python函数,它将numpy数组的内容转换成一个用ctypes本身创建的双指针矩阵( 如本讨论所示 )。 还添加对numpy对象形状和步幅的支持,以便您可以正确运行转换。 转换后,将新创建的双指针结构传递给原始函数。