PyArray_SimpleNewFromData
是 NumPy C API 中的一个函数,用于从已有的数据缓冲区创建一个 NumPy 数组对象,而不复制数据。这种创建方式可以提高性能,因为它避免了数据的额外拷贝,但同时也带来了数据管理的复杂性,因为原始数据的所有权和生命周期需要由调用者妥善管理。
PyArray_SimpleNewFromData
创建的数组类型取决于传入的数据类型指针。
#include <Python.h>
#include <numpy/arrayobject.h>
// 假设我们有一个 C 函数,它生成一些数据并希望将其作为 NumPy 数组返回给 Python
static PyObject* create_array(PyObject* self, PyObject* args) {
// 假设我们有一些数据
double data[] = {1.0, 2.0, 3.0, 4.0, 5.0};
int size = sizeof(data) / sizeof(data[0]);
// 创建一个维度数组
npy_intp dims[] = {size};
// 使用 PyArray_SimpleNewFromData 创建 NumPy 数组
PyObject* array = PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, data);
// 增加数据缓冲区的引用计数,以防止它在我们仍然需要它时被释放
Py_INCREF(data);
return array;
}
// 模块方法表
static PyMethodDef MyMethods[] = {
{"create_array", create_array, METH_VARARGS, "Create a NumPy array from existing data."},
{NULL, NULL, 0, NULL}
};
// 模块定义结构
static struct PyModuleDef mymodule = {
PyModuleDef_HEAD_INIT,
"mymodule", // 模块名称
NULL, // 模块文档字符串
-1, // 模块状态
MyMethods // 方法定义
};
// 模块初始化函数
PyMODINIT_FUNC PyInit_mymodule(void) {
import_array(); // 初始化 NumPy API
return PyModule_Create(&mymodule);
}
在这个示例中,我们创建了一个简单的 C 扩展模块,它包含一个函数 create_array
,该函数使用 PyArray_SimpleNewFromData
创建一个 NumPy 数组。注意,我们增加了数据缓冲区的引用计数,以确保它在 NumPy 数组存在期间不会被释放。
在实际应用中,你需要确保在适当的时候减少数据缓冲区的引用计数,并在不再需要时释放它。这通常涉及到更复杂的内存管理策略,可能需要使用智能指针或其他资源管理技术。
领取专属 10元无门槛券
手把手带您无忧上云