将numpy数组传递给c++函数并返回numpy数组作为输出的最有效方法是什么?
What is the most efficient way to pass numpy array to c++ function and return numpy array as output?
我创建了一个共享库。我像这样使用
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_ParseTuple
或PyArg_ParseTupleAndKeywords
),则执行PyObject_CheckBuffer
,以确保类型支持协议(numpy数组做),然后PyObject_GetBuffer
填充Py_buffer
结构体,包含物理地址,维度,等的底层内存块。返回一个numpy缓冲区更复杂;总的来说,我发现这样做就足够了创建我自己类型的对象,这些对象也支持缓冲区(在PyTypeObject
中将tp_as_buffer
设置为非空)。否则(但我实际上还没有尝试过),你将不得不这样做导入numpy模块,获取它的array
属性,用正确的参数,然后使用上面的缓冲区协议您这样构造的对象
相关文章:
- C++返回 Numpy 数组的 Python 扩展模块
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 如何通过 cython 将 numpy 数组列表传递给 C++
- Pybind11 默认参数 numpy 数组或 None
- Pybind11:在C++中使用Pybind11转换numpy数组的问题
- 使用SWIG将numpy数组元素(int)传递给c++int
- 从 numpy 数组获取指针以将图像发送到C++
- 从结构的 C 数组到带有 ctypes 的 NumPy 数组的高效转换
- 使用 Boost.Python 将 numpy 数组传递给C++
- 如何使用pybind传递numpy数组列表
- 通过 Pybind11 返回 numpy 数组
- 如何在C 中创建类似于Python的Numpy数组的数组
- Xtensor将numpy数组传递到XT :: XTENSOR参数类型
- Cython:从参考获得时缺少两个前元素的 Numpy 数组
- 将 numpy 数组公开为C++向量
- 带有Boost Python的Wrap C 功能 - Numpy数组类型
- 如何向armadillo(C++)发送一个numpy数组,并从armadillo返回一个numdy数组
- 如何将 numpy 数组正确传递给 Cython 函数
- 从NumPy数组到Mat(OpenCV)的C++转换
- 如何使用指针将 numpy 数组传递给 C++/SWIG,而无需依赖 numpy.i