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

时间:2014-05-14 11:41:13

标签: python c++ arrays numpy

我创建了一个共享库。我就像那样使用它

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 个答案:

答案 0 :(得分:2)

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