numpy C API中的import_array是如何工作的?

dauxcl2d  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(187)

我试图将c++中的c风格数组转换为numpy数组,并在尝试使用“PyArray_SimpleNewFromData”函数时遇到问题。

import_array()

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

#include <Python.h>
#include <numpy/arrayobject.h>

int main(){
    Py_Initialize();
    import_array();
    Py_Finalize();
    return 0;
}

产生编译器错误
错误:return-语句没有值,在函数返回'int' [-fpermissive] import_array()中;
我看了几个例子,比如:
Numpy C-Api示例给出了SegFault
PyArray_SimpleNewFromData example
https://codereview.stackexchange.com/questions/92266/sending-a-c-array-to-python-numpy-and-back
Numpy/CAPI error with import_array() when compiling multiple modules
但是无论我尝试什么(即使看起来像是在遵循这些例子),我似乎都会遇到上面的编译器错误。我错过了什么或做错了什么?关于如何调用import_array()函数的解释将是非常受欢迎的。感谢您的帮助!
更新:
我正在使用Python 2.7.11,我认为它可能与这里讨论的内容有关:
https://github.com/clemenscorny/brisk/issues/3
但我还是不知道怎么解决

vlf7wbxs

vlf7wbxs1#

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

huwehgph

huwehgph2#

这是numpy中的一个bug:import_array()是一个宏,可以返回0NULL或无(void)。
在strict模式下编译器会验证函数的返回类型,因此无法使用。返回整数的函数不能返回NULL。返回指针的函数不能返回0。返回某些值的函数不能不返回任何值。
有一个替代宏可以使用import_array(0)

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

参见numpy源代码__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

相关问题