C 数组到 PyArray

2024-01-04

我正在编写一个 Python C 扩展,而不使用 Cython。

我想在 C 中分配一个双精度数组,在内部函数(恰好在 Fortran 中)中使用它并返回它。我指出 C-Fortran 接口在 C 中运行得很好。

static PyObject *
Py_drecur(PyObject *self, PyObject *args)
{
  // INPUT
  int n;
  int ipoly;
  double al;
  double be;

  if (!PyArg_ParseTuple(args, "iidd", &n, &ipoly, &al, &be))
    return NULL;

  // OUTPUT
  int nd = 1;
  npy_intp dims[] = {n};
  double a[n];
  double b[n];
  int ierr;

  drecur_(n, ipoly, al, be, a, b, ierr);

  // Create PyArray
  PyObject* alpha = PyArray_SimpleNewFromData(nd, dims, NPY_DOUBLE, a);
  PyObject* beta = PyArray_SimpleNewFromData(nd, dims, NPY_DOUBLE, b);

  Py_INCREF(alpha);
  Py_INCREF(beta);

  return Py_BuildValue("OO", alpha, beta);
}

我调试了这段代码,当我尝试从 a 中创建 alpha 时,出现分段错误。到那里一切正常。函数 drecur_ 可以工作,如果删除它,我也会遇到同样的问题。

现在,围绕 C 数据定义 PyArray 的标准方法是什么?我找到了文档,但没有很好的例子。另外,内存泄漏怎么办?返回前 INCREF 是否正确,以便保留 alpha 和 beta 的实例?当不再需要它们时,释放怎么办?

EDIT我终于用在中找到的方法得到了正确的结果NumPy 食谱 http://www.scipy.org/Cookbook/C_Extensions/NumPy_arrays.

static PyObject *
Py_drecur(PyObject *self, PyObject *args)
{
  // INPUT
  int n;
  int ipoly;
  double al;
  double be;
  double *a, *b;
  PyArrayObject *alpha, *beta;

  if (!PyArg_ParseTuple(args, "iidd", &n, &ipoly, &al, &be))
    return NULL;

  // OUTPUT
  int nd = 1;
  int dims[2];
  dims[0] = n;
  alpha = (PyArrayObject*) PyArray_FromDims(nd, dims, NPY_DOUBLE);
  beta = (PyArrayObject*) PyArray_FromDims(nd, dims, NPY_DOUBLE);
  a = pyvector_to_Carrayptrs(alpha);
  b = pyvector_to_Carrayptrs(beta);
  int ierr;

  drecur_(n, ipoly, al, be, a, b, ierr);

  return Py_BuildValue("OO", alpha, beta);
}

double *pyvector_to_Carrayptrs(PyArrayObject *arrayin)  {
  int n=arrayin->dimensions[0];
  return (double *) arrayin->data;  /* pointer to arrayin data as double */
}

请随意对此发表评论并感谢您的回答。


所以首先看起来可疑的是你的数组a and b都在函数的局部范围内。这意味着返回后您将获得非法内存访问。

所以你应该用以下方式声明数组

double *a = malloc(n*sizeof(double));

然后您需要确保稍后由您创建的对象释放内存。 请参阅文档的这段引用:

Py对象PyArray_SimpleNewFromData(int nd, npy_intp暗淡、int 类型编号、void* 数据)

有时,您希望将其他地方分配的内存包装到 ndarray 对象中以供下游使用。这个例程使执行此操作变得简单。前三个参数与 PyArray_SimpleNew 中的相同,最后一个参数是指向 ndarray 应该使用的连续内存块的指针,因为它的数据缓冲区将以 C 风格的连续方式解释。返回对 ndarray 的新引用,但 ndarray 不会拥有其数据。当这个ndarray被释放时,指针不会被释放。

您应该确保在返回的数组存在时不会释放所提供的内存。处理此问题的最简单方法是数据来自另一个引用计数的 Python 对象。传入指针后,该对象的引用计数应该增加,并且返回的 ndarray 的基成员应该指向拥有该数据的 Python 对象。然后,当 ndarray 被释放时,基成员将被适当地 DECREF。如果您希望在 ndarray 被释放后立即释放内存,那么只需在返回的 ndarray 上设置 OWNDATA 标志即可。

对于你的第二个问题Py_INCREF(alpha);通常仅当您打算将引​​用保留在全局变量或类成员中时才需要。 但由于您只是包装一个函数,因此您不必这样做。 可悲的是,该功能可能是PyArray_SimpleNewFromData不会将参考计数器设置为 1,如果是这种情况,您必须将其增加到 1。我希望这是可以理解的;)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 数组到 PyArray 的相关文章

  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐

  • Vue debounce 方法?

    我知道 Vue js 内置了在输入字段上进行反跳的功能 我创建了一个滑块 它触发一个不使用输入字段的方法 我想知道是否可以利用方法内部的去抖功能 除了简单地向输入添加去抖功能之外 是否还可以使用此功能 或者我需要为此编写自己的功能吗 我刚刚
  • 从 web.config 重定向到 root 登录页面

    会话过期时 我将用户重定向到登录页面 Login aspx是在根中 我在 web config 文件中声明了这样的路径
  • PHP“while”循环或另一个“while”循环中的“if”语句?

    我有一个返回 HTML 表的 PHP MySQL 查询 但我被困在需要进行第二个查询的部分while循环该查询 我不知道从这里该去哪里 我尝试了几种不同的方法 我希望它循环并给我第一组数据 然后使用 Order ID 并获取第二组数据并将第
  • 如何在Android智能手机中使用加速度传感器找到位移距离?

    我有一部 Android 智能手机 其中包含加速器传感器 指南针传感器和陀螺仪传感器 我想使用这个传感器计算位移距离 我已经尝试过基本方法 即 final velocity initial velocity acceleration tim
  • 切换仅包含相同文本的 div

    HTML div class event div class clicker click div div class title a href first event a div div div class event div class
  • 检索 Facebook 粉丝姓名

    我正在尝试获取我管理的 Facebook 粉丝页面的粉丝姓名 我做了一些窥探 显然 FB API 不支持这一点 但 Facebook 实际上使用 AJAX JSON 来填充列表 无论如何 任何人都可以建议一种方法来让我自己调用并以纯文本形式
  • 超小屏幕上的居中按钮 Material-UI React 不起作用(justify-xs-center)

    我尝试了一切 但似乎我错过了一些东西 当屏幕特别小时 我花了很多时间在网格内制作一个按钮中心 这段代码工作完美 但问题是我希望我的按钮仅在屏幕特别小时而不是在所有尺寸上居中 工作代码 Grid item xs 12 gt
  • 不显示python OpenCV错误

    我正在使用 OpenCV 和 python 更具体地说findTransformECC的功能cv2执行图像配准 如果算法不收敛 此函数可能会引发错误 我用一个简单的方法捕获了错误try except指令 然后我处理错误 但是 OpenCV
  • 在 Swing 中使用计时器显示图片 5 秒

    我正在尝试使用以下方法为我的应用程序制作登录图片Timer 这个想法是 当用户打开应用程序时 他将看到一张图片 5 秒钟 然后应用程序将启动 我尝试过 正如你在方法中看到的shoutoff To change this license he
  • Facebook 的 Android ProGuard 设置

    我终于找到了为什么我的应用程序崩溃而构建的发布 ProGuard 确实从我的应用程序中剥离了代码 但我通过在 proguard android txt 在 sdk 中找到 中使用 keep 命令手动添加类来阻止这种情况 对于 Faceboo
  • 如何使用 NEST 在 Elasticsearch 中按索引获取所有文档?

    我想通过索引获取所有文档 我已经尝试过以下方法 var response client Search s gt s Index test MatchAll 响应返回 成功操作 但它没有命中任何文档 尽管该索引下有很多文档 To get al
  • npm 在 eslint 报告末尾抛出错误

    我在打字稿项目上运行 eslint 时遇到问题 我有以下 package json 我在其中编写了一个运行 eslint 的脚本 name ts tutorial version 1 0 0 description main index j
  • AngularJS中触发输入文件点击事件

    我正在尝试模拟 AngularJS 中文件输入的单击事件 我见过工作 jQuery 示例 http jsfiddle net fEBFp 1 但我不想使用 jQuery use strict angular module MyApp con
  • type_info 不考虑简历限定符:这是对的吗?

    此代码打印 1 是正确的行为还是 g 4 5 的怪癖 include
  • 共享库构造函数不工作

    在我的共享库中 我必须在加载时进行某些初始化 如果我用 GCC 属性定义函数 attribute constructor 它不起作用 即当加载链接我的共享库的程序时它不会被调用 如果我将函数名称更改为 init 有用 显然使用 init a
  • Android 框架布局点击侦听器不起作用

    我有一个FrameLayout有两个嵌套LinearLayouts 我想要一个onClickListener for FrameLayout 经过搜索我得到了解决方案clickable false 这是我的布局文件
  • 有没有一种简单的方法可以将所有 jar 依赖项复制到 XSBT 0.11.2 中的某个目录?

    当从旧版本的 SBT 切换到最新版本时 我们失去了快速获取所有 jar 依赖项并将它们复制到目录的能力 有没有一种简单的方法可以在 XSBT 0 11 2 中执行相同的操作 将以下内容添加到您的build sbt将所有依赖项复制到lib m
  • 无法在 Symfony 2 中使用渲染方法找到 Twig 模板

    我在尝试引用特定 Twig 模板时遇到问题 我正在使用render方法是 SF2 主控制器的一部分 但我显然没有正确引用 使用它 这是我的目录 文件结构 src AyrshireMinis CommonBundle Controller D
  • 如何根据用户输入退出 while(1) ?

    我有一个简单的server client终端 服务器从客户端接收字符串并对其进行处理 服务器只有收到后才会开始处理end of input在我的例子中的角色是 下面的 while 循环旨在允许用户输入多个不同的字符串 并且应该在接收到时停止
  • C 数组到 PyArray

    我正在编写一个 Python C 扩展 而不使用 Cython 我想在 C 中分配一个双精度数组 在内部函数 恰好在 Fortran 中 中使用它并返回它 我指出 C Fortran 接口在 C 中运行得很好 static PyObject