将 numpy 矩阵作为参数传递给采用双指针的 C 函数的规范方法是什么?
上下文:我正在使用 numpy
来验证一些 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
矩阵。转换导致 Python 错误
TypeError: _type_ must have storage info
注意:这个问题是几年前提出的here , 但没有完全成功的解决方案。
最佳答案
我认为您正在寻找 numpy 的 ndarray
(或 matrix
)中的 ctypes
接口(interface)。你可能有一个 look here for more information on numpy's manual .
请注意,numpy C-API 使用单个指针存储 ndarray
(或与此相关的矩阵)(参见 http://docs.scipy.org/doc/numpy/reference/c-api.types-and-structures.html#c.PyArrayObject )。您不能在 C 中将这个单指针转换为双指针,只是因为它们是不同的类型。此外,numpy 不仅存储这些对象的数据,它还存储有关矩阵形状和步幅的信息(数据如何在提供的数据指针上组织)。如果不知道所有这些信息,您的代码将无法在所有条件下运行。例如,如果您在将矩阵连接到您的代码之前对其进行转置,您将获得意想不到的结果!
根据您的设置,有几种解决方案:
如果您可以修改您的库的 API,请对其进行更改,以便您可以传递有关数据指针以及矩阵形状及其步长的 numpy 信息。然后,使用上面的链接了解如何将 numpy/ctypes 支持与您的新 API 连接起来。
如果您无法修改您的 API,我建议您创建一个基于 ctypes 的 Python 函数,将 numpy 数组的内容转换为使用 ctypes 本身创建的双指针矩阵 (as suggested on this discussion)。还添加对 numpy 对象形状和步幅的支持,以便您可以正确运行转换。转换后,将新创建的双指针结构传递给您的原始函数。
关于python - 将 numpy.matrix 转换为 C 双指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27681814/