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

2024-01-08

获取 numpy 矩阵作为采用双指针的 C 函数的参数的规范方法是什么?

Context: 我在用着numpy为了验证一些 C 代码,我有一个 C 函数,它需要一个const double ** const,我正在使用ctypes打电话给.so来自Python。

我试过了:

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

Note: 这个问题几年前就出现过here https://stackoverflow.com/questions/8783302/passing-c-double-pointer-to-python,但没有完全成功的解决方案。


我想你正在寻找ctypesnumpy 中的接口ndarrays (or matrix对于这个问题)。您可能有一个在这里查看有关 numpy 手册的更多信息 http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.ctypes.html.

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐