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

标签 python c numpy matrix

将 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 不仅存储这些对象的数据,它还存储有关矩阵形状和步幅的信息(数据如何在提供的数据指针上组织)。如果不知道所有这些信息,您的代码将无法在所有条件下运行。例如,如果您在将矩阵连接到您的代码之前对其进行转置,您将获得意想不到的结果!

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

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

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

关于python - 将 numpy.matrix 转换为 C 双指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27681814/

相关文章:

c - 为什么我会出现段错误 [139]?

Python numpy.square 与 **

javascript - 如何将插件安装到 CkEditor,Django

c - localtime() - 段错误

python - Django 关于删除的多对多关系

c - 有一个我不知道的错误

python - np.any(np.not_equal(arr, 0), axis=0) 与 np.count_nonzero(arr)

python - 读取列中的数据 Python 2.7.3

python - Python 中的多维/多变量动态时间规整 (DTW) 库/代码

python - 在 try 中的 Nose 测试中手动添加错误 - except