将 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_ParseTuple
或PyArg_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