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

use*_*717 9 c python numpy matrix

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

上下文:我numpy用来验证一些C代码 - 我有一个C函数需​​要一个 const double ** const,我ctypes用来调用.soPython.

我试过了:

func.argtypes = ctypeslib.ndpointer(dtype=double, ndim=2, flags="C_CONTIGUOUS")
Run Code Online (Sandbox Code Playgroud)

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

func.argtypes = ctypes.POINTER(ctypes.POINTER(ctypes.c_double))
Run Code Online (Sandbox Code Playgroud)

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

TypeError: _type_ must have storage info
Run Code Online (Sandbox Code Playgroud)

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

And*_*jos 3

我认为您正在寻找ctypesnumpy 的接口ndarray(或matrix就此而言)。您可以在这里查看有关 numpy 手册的更多信息

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

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

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

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