numpy C API 中的import_array如何工作?

How does import_array in numpy C API work?

本文关键字:何工作 工作 array API 中的 import numpy      更新时间:2023-10-16

我正在尝试将 c++ 中的 c 样式数组转换为 numpy 数组,并在尝试使用"PyArray_SimpleNewFromData"函数时遇到了问题。原来我需要打电话

import_array()

虽然我不明白如何调用这个函数。每当我尝试调用它时,我都会收到编译器错误,我无法理解。例如,编写以下简单脚本:

#include <Python.h>
#include <numpy/arrayobject.h>
int main(){
Py_Initialize();
import_array();
Py_Finalize();
return 0;
}

产生编译器错误

错误:返回语句没有值,在函数中返回 'int' [-允许] import_array((;

我看了几个例子,例如:

Numpy C-API 示例给出了一个 SegFault

PyArray_SimpleNewFromData示例

https://codereview.stackexchange.com/questions/92266/sending-a-c-array-to-python-numpy-and-back

编译多个模块时出现 import_array(( 的 numpy/CAPI 错误

但是无论我尝试什么(即使看起来遵循这些示例(,我似乎都遇到了上面的编译器错误。我错过了什么或做错了什么?关于如何调用 import_array(( 函数的解释将非常受欢迎。感谢您的帮助!

更新:

我正在使用python 2.7.11,我认为它可能与这里讨论的内容有关:

https://github.com/clemenscorny/brisk/issues/3

但我仍然不知道如何解决它。

从 numpy 读取import_array()的源代码,它是一个主要调用_import_array()常规函数的宏,然后做一些奇怪的异常处理。如果调用_import_array()而不是import_array(),则编译错误将消失。而且,至少在我的情况下,行为是正确的(即调用 Numpy C API 函数时没有段错误(

这是numpy中的一个错误:import_array()是一个可以返回0NULL或什么都不返回(void(的宏。

在编译器验证函数返回类型的严格模式下使用是不可能的。返回整数的函数不能返回NULL。返回指针的函数无法返回0。返回某些内容的函数不能返回任何内容。

有一个替代宏可以使用import_array1(0)

int
numpy_init()
{
import_array1(0);
return 0;
}

请参阅数字源代码__multiarray_api.h

#if PY_VERSION_HEX >= 0x03000000
#define NUMPY_IMPORT_ARRAY_RETVAL NULL
#else
#define NUMPY_IMPORT_ARRAY_RETVAL
#endif
#define import_array() {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); return NUMPY_IMPORT_ARRAY_RETVAL; } }
#define import_array1(ret) {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); return ret; } }
#define import_array2(msg, ret) {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, msg); return ret; } }
#endif