numpy C API 中的import_array如何工作?
How does import_array in numpy C API work?
我正在尝试将 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
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?