正确的方法将numpy.matrix转换为C双指针
将numpy矩阵作为参数传递给C函数采用双指针的规范方法是什么?
上下文 :我使用numpy
validation一些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不仅将数据存储在这些对象上,还存储有关矩阵形状和步幅的信息(数据如何在提供的数据指针上组织)。 如果不了解所有这些信息,您的代码将无法在所有条件下运行。 例如,如果在将矩阵与代码连接之前转置矩阵,则会得到意想不到的结果!
根据您的设置,有几种解决方案:
-
如果您可以修改库的API,请对其进行更改,以便您不仅可以传递有关数据指针的信息,还可以传递矩阵的形状及其步幅。 然后,使用上面的链接来确定如何使用新API连接numpy / ctypes支持。
-
如果你不能修改你的API,我建议你创建一个基于ctypes的Python函数,它将numpy数组的内容转换成一个用ctypes本身创建的双指针矩阵( 如本讨论所示 )。 还添加对numpy对象形状和步幅的支持,以便您可以正确运行转换。 转换后,将新创建的双指针结构传递给原始函数。