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

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

【问题讨论】:

    标签: python c++ arrays numpy


    【解决方案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。
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多