我正在尝试将 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()
是一个可以返回0
或NULL
或什么都不返回(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