用 C 扩展 python,返回 numpy 数组给出垃圾

2023-12-09

我正在包装一个 C 文件,以便可以在 python 中使用它。 C 函数的输出是一个双精度数组。我希望这是 python 中的一个 numpy 数组。我得到垃圾。这是生成错误的示例。

首先是C文件(重点关注最后一个函数定义,其他都应该没问题):

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

static char module_docstring[] =
    "docstring";

static char error_docstring[] =
        "generate the error";

static PyObject *_aux_error(PyObject *self, PyObject *args);

static PyMethodDef module_methods[] = {
        {"error", _aux_error, METH_VARARGS, error_docstring},
        {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC init_tmp(void) {

    PyObject *m = Py_InitModule3("_tmp", module_methods, module_docstring);
    if (m == NULL)
        return;

    /* Load `numpy` functionality. */
    import_array();
}

static PyObject *_aux_error(PyObject *self ,PyObject *args) {

    double vector[2] = {1.0 , 2.0};

    npy_intp dims[1] = { 2 };

    PyObject *ret  = PyArray_SimpleNewFromData(1, dims, (int)NPY_FLOAT , vector );
    return ret;
}

编译顺利(据我了解 - 我使用了一个可以编译所有内容的 python 脚本)。

在 python 中,我运行以下脚本来测试我的新模块:

try:
    import _tmp
    res = _tmp.error()
    print(res)
except:
    print("fail")

我在屏幕上看到的结果是垃圾。我尝试替换(int)NPY_FLOAT with (int)NPY_FLOAT32, (int)NPY_FLOAT64, (int)NPY_DOUBLE我仍然收到垃圾。 我使用的是python2.7。

谢谢!!!

EDIT:按照下面的答案,我将最后一个函数更改为:

static PyObject *_aux_error(PyObject *self, PyObject *args) {


    double *vector = calloc(2, sizeof(double));
    vector[0] = 1.0;
    vector[1] = 2.0;


    npy_intp *dims = calloc(1 , sizeof(npy_intp));
    dims[1] = 2;


    PyObject *ret  = PyArray_SimpleNewFromData(1, dims, (int)NPY_FLOAT , &vector );
    return ret;
}

现在 python 显示一个空数组。


尝试改变这个:

static PyObject *_aux_error(PyObject *self) {

to this:

static PyObject *_aux_error(PyObject *self, PyObject *args) {

Python 将通过args参数,即使你没有用它定义你的函数。

您的代码仍然存在一个根本问题。您已经使用数组创建了一个 numpy 数组,vector,即在堆栈上。什么时候_aux_error返回,该内存被回收并可能被重用。

您可以使用创建数组PyArray_SimpleNew()分配 numpy 数组,然后复制vector到数组的数据:

static PyObject *_aux_error(PyObject *self, PyObject *args)
{
    double vector[2] = {1.0 , 2.0};
    npy_intp dims[1] = {2};

    PyObject *ret = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
    memcpy(PyArray_DATA(ret), vector, sizeof(vector));
    return ret;
}

请注意,我将类型更改为NPY_DOUBLE; NPY_FLOAT是32位浮点类型。


在评论中,您询问了如何动态分配内存_aux_error。这是该示例的一个变体,可能有用。数组的长度仍然是硬编码的dims,所以它并不完全通用,但可能足以解决评论中的问题。

static PyObject *_aux_error(PyObject *self, PyObject *args)
{
    double *vector;
    npy_intp dims[1] = {5};
    npy_intp k;

    PyObject *ret = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
    vector = (double *) PyArray_DATA(ret);
    /*
     *  NOTE: Treating PyArray_DATA(ret) as if it were a contiguous one-dimensional C
     *  array is safe, because we just created it with PyArray_SimpleNew, so we know
     *  that it is, in fact, a one-dimensional contiguous array.
     */
    for (k = 0; k < dims[0]; ++k) {
        vector[k] = 1.0 + k;
    }
    return ret;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 C 扩展 python,返回 numpy 数组给出垃圾 的相关文章

随机推荐

  • HttpClient - 如何判断服务器是否更快地关闭?

    我正在使用 NETHttpClient向我的服务器发送请求 我已经设定HttpClient Timeout属性为 10 秒 所以我得到了A task was cancelled每当服务器无法在 10 秒内处理我的请求时 就会出现异常 到这里
  • Windows快捷方式的内部结构是怎样的?

    一台计算机上有 3 个硬盘 2 个 Windows XP 1 个 Windows 7 依次从每个硬盘加载操作系统 我发现在第一个 XP 中创建的一些工作快捷方式 不是全部 在第二个 XP 和 Windows 7 中不起作用 不可用于查看快捷
  • Xcode 4.5 iOS 6.0 模拟器方向不起作用

    我已经将我的 Xcode 更新到 4 5 我已经实现了如下方向方法 BOOL shouldAutorotate return YES NSUInteger supportedInterfaceOrientations return UIIn
  • ASMX 操作 404s,但 ASMX 服务描述没有,url 路由问题?

    所以我发现自己遇到了一个难题 我们的应用程序中有一些旧的 asmx Web 服务 多年来一直运行良好 突然间 他们停止了构建服务器 CI 上的工作 我说停止工作 因为即使当我导航到服务时显示服务描述 调用任何操作都不会路由到服务 Web 表
  • 在 React 中,ref 是引用虚拟 DOM 还是实际 DOM?

    我假设虚拟 DOM 并且 React 通过比较来处理它 但我有一位招聘人员说 ref 会影响实际的 DOM 我不明白这是怎么回事 我认为他们只是误会了 Refs 应该引用实际的 DOM Refs 的一种用法是与第三方 DOM 库集成 因此您
  • 使用 Lodash 合并复杂对象数组

    我是 Lodash 的新手 正在尝试解决这个问题 但可以找到一个好方法 我有一个从数据库返回的对象数组 数据结构如下 var data index 1 Aoo a1 Boo b2 index 1 Aoo a2 Boo b2 index 2
  • 无效的 Swift 支持/无效的 Swift 实现

    我想上传一个用 swift 编写的应用程序 应用程序加载器成功交付应用程序 但几分钟后我收到苹果的回复 无效的 Swift 支持 该捆绑包包含无效的 Swift 实现 该应用程序可能是使用不合规或预发布的工具构建或签名的 访问develop
  • 如何更新已从 BOT 发送给用户的自适应卡?

    我已经发送了包含捕获详细信息和按钮的卡片 从任务模块单击提交后 该模块将通过 http API 保存详细信息 此处的活动类型为 调用 现在我必须更新现有的自适应卡 我有更新消息的代码 但如何更新卡或再次重新发送卡 connector new
  • Webpack 提供的 Angular 2 应用程序基于环境的属性?

    我正在使用由 JHipster 生成并由 Spring Boot 服务器提供服务的独立 Angular 控制台 我希望根据环境 本地 开发 产品等 提供具有不同属性的应用程序 我看到很多关于配置每个环境的 webpack 构建的帖子 但我需
  • PHP/Regex:bbcode [s] 或 [strike] 的简单正则表达式无法工作

    对于一个愚蠢的 bbcode 解析器 我想将两个定义添加到一个中 我最初的 preg replace 定义是这样的 s s si
  • 无法在 Heroku 上使用 Gmail 发送电子邮件

    我无法让我的 Rails 应用程序使用 Gmail 发送电子邮件 我可以在本地开发环境中发送电子邮件 但无法从 Heroku 发送 这是我的配置文件 应用程序 rb config action mailer smtp settings ad
  • Spark Streaming StreamingContext.start() - 启动接收器时出错 0

    我有一个使用 Spark Streaming 的项目 我使用 spark submit 运行它 但遇到了以下错误 15 01 14 10 34 18 ERROR ReceiverTracker Deregistered receiver f
  • 如何使 Satchmo 在 Google App Engine 中工作

    我知道数据存储方面存在很大差异 但既然 django 是捆绑的并且它从 Satchmo 中抽象出数据存储 那么可以做些什么吗 事实上 我不是 Python 爱好者 到目前为止主要是 Java PHP 但我愿意学习 另外 如果今天不可能 让我
  • 如何将 Node.js 应用程序上传到 FTP 服务器?

    我对 Node js 有点陌生 但我构建了一个应用程序 并对它非常满意 我想知道如何将 Node js 应用程序上传到 FTP 服务器 有可能做到这一点吗 Node JS 应用程序只是文件的集合 您可以像任何其他文件一样使用 FTP 将它们
  • 实体框架代码首先将 TPT 转换为 TPH

    我使用 EF Code First 使用 TPT 开发了一个应用程序 发布附件 评论等 它运行良好 并且正在与许多客户进行 beta 测试 但是 存在许多层次结构 因此 我有一个包含各种继承模型的基本模型 每个模型都包含许多属性 这些属性本
  • HTMLAgilityPack 使用 C# 解析 HTML 时出现问题

    我只是想了解 HTMLAgilityPack 和 XPath 我试图从纳斯达克网站获取 HTML 链接 公司列表 http www nasdaq com quotes nasdaq 100 stocks aspx 我目前有以下代码 Html
  • 使用 jquery 显示/隐藏文本

    基本上我有 6 个按钮和 6 个段落 每个按钮与特定段落相关 我想在单击某个按钮时显示一段文本 然后在再次单击该按钮时隐藏该段落 我浏览过类似的问题 但似乎无法让它发挥作用 我认为这是因为我才开始尝试使用 jquery 并且没有真正理解这个
  • tf.keras 损失变为 NaN

    我正在 tf keras 中编写一个 3 层的神经网络 我的数据集是 MNIST 数据集 我减少了数据集中的示例数量 因此运行时间较短 这是我的代码 import tensorflow as tf from tensorflow keras
  • 在appendChild之后发生的事件

    将元素添加到网页后是否会发生事件 理想情况下我想这样做 var div createSomeDiv div on function console log Div was added document body appendChild di
  • 用 C 扩展 python,返回 numpy 数组给出垃圾

    我正在包装一个 C 文件 以便可以在 python 中使用它 C 函数的输出是一个双精度数组 我希望这是 python 中的一个 numpy 数组 我得到垃圾 这是生成错误的示例 首先是C文件 重点关注最后一个函数定义 其他都应该没问题 i