将 numpy 数组传递给 c++ 函数并返回 numpy 数组作为输出的最有效方法是啥?

Posted

技术标签:

【中文标题】将 numpy 数组传递给 c++ 函数并返回 numpy 数组作为输出的最有效方法是啥?【英文标题】:What is the most efficient way to pass numpy array to c++ function and return numpy array as output?将 numpy 数组传递给 c++ 函数并返回 numpy 数组作为输出的最有效方法是什么? 【发布时间】:2014-05-14 11:41:12 【问题描述】:

我创建了一个共享库。我就是这样用的

class CAudioRecoveryStrategy(AbstractAudioRecoveryStrategy):
    def __init__(self):
        array_1d_double = npct.ndpointer(dtype=numpy.double, ndim=1, flags='CONTIGUOUS')
        self.lib = npct.load_library("libhello", ".")

        self.lib.demodulate.argtypes = [array_1d_double, array_1d_double, ctypes.c_int]

    def demodulate(self, input):
        output = numpy.empty_like(input)
        self.lib.demodulate(input, output, input.size)
        return output

现在我有一个问题,在 c++ 代码中我只有指向输出数据数组的指针,而不是数组。所以我不能返回数组,除非我手动复制它。

正确的做法是什么?它必须是高效的(如对齐内存等)

【问题讨论】:

【参考方案1】:

Numpy 数组实现缓冲区协议,请参阅 https://docs.python.org/2/c-api/buffer.html。尤其, 将输入对象解析为 PyObject* (转换 O 如果您是 使用PyArg_ParseTuplePyArg_ParseTupleAndKeywords),然后 做PyObject_CheckBuffer,以确保该类型支持 协议(numpy数组做),然后PyObject_GetBuffer填写 一个 Py_buffer 结构,包含物理地址、维度、 等底层内存块。返回一个 numpy 缓冲区 比较复杂;总的来说,我发现它足以 创建我自己类型的对象,它们也支持缓冲区 协议(在PyTypeObject 中将tp_as_buffer 设置为非空)。 否则(但我实际上并没有尝试过),你必须 导入 numpy 模块,获取其 array 属性,调用它 正确的参数,然后使用上面的缓冲区协议 你这样构造的对象。

【讨论】:

我不是在写 python 扩展。我正在使用共享库。所以那里没有 PyObjects。

以上是关于将 numpy 数组传递给 c++ 函数并返回 numpy 数组作为输出的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 c++ Eigen 库处理 numpy 数组后,输出错误

如何通过 cython 将 numpy 数组列表传递给 c++

使用 SWIG 将 numpy 数组元素(int)传递给 c++ int

如何将数组从 c++ 传递给 python 函数并将 python 返回的数组检索到 c++

将 numpy 数组传递给 C++

将 C++ 数组发送到 Python 并返回(使用 Numpy 扩展 C++)