【问题标题】:Proper way to cast numpy.matrix to C double pointer将 numpy.matrix 转换为 C 双指针的正确方法
【发布时间】:2015-02-25 05:20:59
【问题描述】:

将 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 数组理想情况下是一块连续的内存,索引类似于 A[i,j] = A[i*n_columns + j],而不是包含指向双精度数组的指针的一维数组,因此没有简单的解决方案。您需要手动构建指向每一行的一维指针数组。
  • @RobertT.McGibbon:想要将其移至答案以便我们关闭问题?
  • numpy 邮件列表上也有关于这个话题的非常完整的讨论:mail.scipy.org/pipermail/numpy-discussion/2015-January/…

标签: python c numpy matrix


【解决方案1】:

我认为您正在寻找 numpy 的 ndarrays 中的 ctypes 接口(或matrix)。你可能有一个look here for more information on numpy's manual

请注意,numpy C-API 使用单个指针存储ndarrays(或矩阵)(请参阅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 对象形状和步幅的支持,以便您可以正确运行转换。转换后,将新创建的双指针结构传递给你原来的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 2013-02-20
    • 2012-01-24
    • 2020-12-10
    • 2013-03-12
    • 1970-01-01
    • 2011-11-17
    • 2020-05-05
    相关资源
    最近更新 更多