numpy C API 中的 import_array 如何工作?

Posted

技术标签:

【中文标题】numpy C API 中的 import_array 如何工作?【英文标题】:How does import_array in numpy C API work? 【发布时间】:2019-03-20 14:21:00 【问题描述】:

我正在尝试将 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'的函数中[-fpermissive] 导入数组();

我看了几个例子,比如:

Numpy C-Api example gives a 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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于numpy C API 中的 import_array 如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

Numpy API

使用 C API 访问 NumPy 数组的视图

迁移到 numpy api 1.7

是否可以通过 Numpy 的 C API 创建多项式?

Python C-API 和 Numpy:import_array 上的核心转储

Numpy C API - 使用 PyArray_Descr 创建数组会导致段错误