用C语言中的数据缓冲区和NumPy数组之间的转换来包装Python接口的C程序的最佳方法是什么?

2024-06-28 12:27:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个预先发布的大型C/C++图像库,具有预处理图像类型。我们希望它与Python接口。例如,我们知道如何使用SWIG做大多数事情,但是我们希望我们的界面使用NumPy而不是一个自制的结构类型来存储我们的图像。在

有人举个例子吗?web上有一些例子可以将NumPy与裸指针连接起来。我们如何将NumPy接口到现有的C类型结构,如下面所示:

typedef struct xvimage {

    int nx, ny, nz, nt ; // dimensions

    enum {PIX_UINT8, PIX_INT16, PIX_UINT16, PIX_INT32, PIX_FLOAT, PIX_DOUBLE} ; // type

    void *data;

} xvimage;

Tags: 图像numpyweb类型界面事情结构struct
1条回答
网友
1楼 · 发布于 2024-06-28 12:27:58

基本上有三种方法:

  1. 从一个数组拷贝到一个数组,反之亦然。当给定C/C++图像时,创建一个NUMPY数组并复制数据,当给定一个NUMPY数组时,创建C/C++图像并复制数据。

  2. NumPy数组作为C数据指针的包装器。使用给定的数据指针创建一个NumPy数组。确保你的C/C++图像保存数据指针的寿命比NUMPY数组更长。NumPy数组的生存期可能更短,因为在这种情况下,它不会尝试删除数据。

  3. P> C/C++图像缓冲区作为一个围绕NUMPY数组指针的包装器。创建一个NumPy数组并提取数据指针,然后使用它就地生成NumPy数组。通过保存Python引用,确保NumPy数组的寿命足够长。

这些都可以在SWIG类型映射中实现。在

在任何情况下,您都需要将类型转换为NumPy类型(NPY\u UINT8,…)并将图像维度存储在npy_intp *中。在

要创建NumPy数组,请使用PyArray_NewPyArray_SimpleNew或{}(Array API)并指定所需的标志,如Fortran样式的continuous或任何对您方便的标志。您可以使用PyArray_NewPyArray_SimpleNewFromData提供自己的数据指针。在

返回值是一个PyObject*,它可以安全地转换为PyArrayObject*(或在前面执行PyArray_Check),数据指针由{}(Array API)提取,它返回一个void *,然后可以将其转换为所需的类型。然后,您可以根据需要执行复制或就地修改。在

要添加对Python对象的引用,请使用Py_INCREFPy_DECREFdoc),以防NumPy数组过早被删除。在

如果您希望在Python对象即将被垃圾回收时得到通知,请使用通过PyWeakref_NewRefdoc)的弱引用。在

相关问题 更多 >