获取 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,但没有完全成功的解决方案。
我想你正在寻找ctypes
numpy 中的接口ndarray
s (or matrix
对于这个问题)。您可能有一个在这里查看有关 numpy 手册的更多信息 http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.ctypes.html.
请注意 numpy C-API 存储ndarray
s (或矩阵)与单个指针(参见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 不仅存储这些对象上的数据,还存储有关矩阵形状和步幅的信息(数据如何在提供的数据指针上组织)。如果不了解所有这些信息,您的代码将无法在所有条件下运行。例如,如果在将矩阵连接到代码之前转置矩阵,您将得到意想不到的结果!
根据您的设置,有几种解决方案:
如果您可以修改库的 API,请对其进行更改,以便您不仅可以传递与数据指针有关的 numpy 信息,还可以传递与矩阵的形状及其步幅有关的 numpy 信息。然后,使用上面的链接了解如何将 numpy/ctypes 支持与您的新 API 连接起来。
如果您无法修改您的 API,我建议您创建一个基于 ctypes 的 Python 函数,将 numpy 数组的内容转换为使用 ctypes 本身创建的双指针矩阵(正如本次讨论所建议的 http://www.gossamer-threads.com/lists/python/python/797494)。还添加对 numpy 对象形状和步幅的支持,以便您可以正确运行转换。转换后,将新创建的双指针结构传递给原始函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)