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

What is the most efficient way to pass numpy array to c++ function and return numpy array as output?

本文关键字:numpy 数组 输出 有效 是什么 方法 返回 c++ 函数      更新时间:2023-10-16

我创建了一个共享库。我像这样使用

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++代码中,我只有输出数据数组的指针,而不是数组。所以我不能返回数组,除非我手动复制它。

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

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属性,用正确的参数,然后使用上面的缓冲区协议您这样构造的对象