使用 C API 创建自定义类对象的 numpy 数组

2023-12-22

使用 C API,我想创建一个包含类型对象的 numpy 数组Quaternion,这是我用 C++ 编写的一个类。我已经有一个数组(实际上是一个std::vector),并且我想制作一个副本——或者如果可能的话使用相同的内存。

由于这不是基本类型,我需要使用Py_Object类型,并且不能使用PyArray_SimpleNew或类似的简单事情。

我想我可能想用PyArray_NewFromDescr甚至PyArray_SimpleNewFromDescr,但我完全不知道如何创建PyArray_Descr我需要描述我的四元数类的对象。

谁能给我一些关于如何制作该 descr 对象的指示?或者让我更好地了解如何构建我的 numpy 数组?

这基本上是一个更通用的版本这个问题 https://stackoverflow.com/questions/19532444/return-list-of-new-custom-class-objects-in-python-c-api,不受干扰。

EDIT:

使用 dastrobu 的提示和我的 SWIG 包装器,我找到了一种方法。我知道并不是每个人都在使用 SWIG,但对于那些使用 SWIG 的人来说,我对另一个问题的回答 https://stackoverflow.com/a/19544185/1194883显示我是如何解决的。


Since Quaternion不是直接的数字类型,你的数组必须有numpy.object as dtype。因此,您可以使用PyArray_SimpleNew(..., NPY_OBJECT)创建一个数组并填充数据。 问题是你的Quaternion类不是 python 类型。因此用对类型对象的引用填充数组Quaternion不管用。 (在这种情况下,如果从 python 中用四元数填充的数组中提取一个元素,您会期望发生什么?) 相反,您需要包装Quaternion类与类似的东西PyQuaternion。包装器负责引用计数和内存管理。它看起来像:

typedef struct {
    PyObject_HEAD
    Quaternion *q;
}PyQuaternion;

static PyTypeObject PyQuaternion_Type = {
    PyObject_HEAD_INIT(NULL)
    0,                                        /*ob_size*/
    "Quaternion",                             /*tp_name*/
    sizeof(PyQuaternion),                     /*tp_basicsize*/
/* ... */
};


static PyObject *
PyQuaternion_new(PyTypeObject *type, PyObject *args, PyObject *kwds){
/* ... */
};

static int 
PyQuaternion_init(PyQuaternion *self, PyObject *args, PyObject *kwds){
/* ... */
};

static void PyQuaternion_dealloc(PyQuaternion *self){
/* ... */
};

此外,您还可以定义自己的 C-APIPyQuaternionType让您能够创造PyQuaternions from Quaternions

static PyObject *
PyQuaternion_New(Quaternion *q){
    PyQuaternion *self;
    self = (PyQuaternion *)PyQuaternion_Type.tp_new(type, NULL, NULL);
    self->q = q; 
    return (PyObject *)self;
}

意识到self->q将由PyQuaternion_dealloc函数,所以要考虑内存管理。最简单的是将所有权传递给包装器并让PyQuaternion_dealloc解除分配self->q.

The PyQuaternion_New函数允许你换行Quaternion对象并将它们填充到任何 python 容器中,例如列表、元组,当然还有 numpy 数组dtype = numpy.object.

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

使用 C API 创建自定义类对象的 numpy 数组 的相关文章

随机推荐

  • protobuf-net 枚举序列化

    为了使用 protobuf net 序列化枚举 需要做什么 当序列化具有枚举属性的类时 我收到以下错误 如果从属性声明中删除 DataMember 属性 则它可以正常工作 System InvalidOperationException 仅
  • 仅使用互斥锁实现读/写锁?

    我试图仅使用互斥锁来实现读 写锁 仅供学习 正当我以为我已经涵盖了所有极端情况 因为程序可以处理各种组合 时 我意识到 我忽略了一个事实 因为它在 ubuntu 中工作 互斥体应该由线程的所有者释放 下面是我的实现 class rw loc
  • 突出显示组合框中的特定项目

    我有一个场景 我用模板名称填充组合框 在这些模板中 有一个是默认模板 我想在填充组合框时突出显示默认模板名称 以便用户知道其中哪一项是默认的 可以这样做吗 如果是的话怎么办 我正在使用 C 2 0 中的 Windows 窗体 这在一定程度上
  • MvvmCross Android - 按钮命令的relativesource绑定的替代方案

    I have a list of items bound to a MvxBindableListView with a MvxItemTemplate I usually have 4 items in my list bound to
  • 如何在 Rails 迁移中将列(包含内容)移动到另一个表?

    我需要将一些列从一个现有表移动到另一个表 如何使用 Rails 迁移来完成此操作 class AddPropertyToUser lt ActiveRecord Migration def self up add column users
  • 角度帖子json来表达

    我正在尝试将 json 发送到服务器节点 expressangular js 我的服务器 js Setup Dependencies var express require express Start Express var app exp
  • 使用 Pinterest SDK 发送到已释放实例的消息

    我正在使用 Pinterest iOS SDK 分享我的 iPad 应用程序中的项目 下面的代码片段总是会崩溃message sent to deallocated instance在评论线上 NSString clientId NSMut
  • 自动将 ipython 输出为 pdf

    我有一个小程序 基本上可以进行各种统计计算并打印结果和图表 目前 获得程序的良好 pdf 输出的一种便捷方法是使用魔术命令 matplotlib inline 在 Jupyter IPython Notebook 中运行我的代码 并通过执行
  • Java 正则表达式,具有积极的向后展望和消极的向前展望

    我正在尝试从这种字符串中提取ou persons ou dc company dc org最后一个字符串立即之前是 a coma 没有跟随 在最后一种情况下 这应该给出dc company dc org 从正则表达式来看 这似乎是消极展望背
  • 在 git add 中显示更多上下文

    例如 使用 git diff 我可以执行以下操作 以在显示差异时显示 10 条周围的上下文行 git diff U10 我可以用 git add patch 做类似的事情吗 理想情况下我想 git add p U10 但我没有找到这样的选项
  • 启用 WhiteNoise 时“collectstatic”命令失败

    我正在尝试通过以下方式提供静态文件白噪声 https github com evansd whitenoise blob master docs django rst as per Heroku https devcenter heroku
  • 获取新的 Apple 设备令牌?

    我正在创建一个应用程序 允许用户注销该应用程序并根据需要以其他用户身份登录 新用户登录后 有什么方法可以从 Apple 获取新的设备令牌吗 有没有办法强制调用didRegisterForRemoteNotificationsWithDevi
  • 确定网络连接带宽(速度)wifi和移动数据

    我想要获取以 kbps 或 mbps 为单位的网络连接带宽 如果设备连接到 WiFi 那么它应该返回网络带宽 速度 以及移动数据 它将返回 wifi 能力速率 但我想要精确的数据传输速率 public String getLinkRate
  • 更改 recyclerView 项目背景 onClick?

    当我按下我的按钮时我就会做到这一点recyclerView这会改变它的背景颜色 这样按下的时候就会可见 但我不太喜欢android 所以我不知道该怎么做 我尝试过在网上找到的一些指南 但其中大多数对我不起作用 就像这样guide https
  • 如何使用 nunit 和 moq 进行异常处理?

    我正在尝试使用 nunits 新的异常处理方式 但我发现很难找到有关它的信息以及如何将它与最小起订量一起使用 我现在有最小起订量 它在模拟方法上抛出异常 但我不知道如何使用 nunit 来捕获它并查看它 有几种不同的方法可以做到这一点 我使
  • `with_items` 输出太冗长

    我编写了一个 ansible 任务来迭代设置列表 使用with items 现在 当我运行 ansible 时 我的所有设置都会被记录 它非常冗长 让人很难看出发生了什么 但是 如果我禁用所有输出no log 当特定项目失败时 我将无法识别
  • 使用 React 构建 CRM Web 资源

    我是新的 Dynamics CRM 我的项目包括表单提交和验证 我计划使用带有 Redux 前端的 React 和 CRM 的服务来构建一个产品 构建 CRM Web 资源的 CRM 最佳实践是什么 有人可以指导我吗 https githu
  • 如何使用 Flask 和 Celery 定期运行函数?

    我有一个烧瓶应用程序 大致如下所示 app Flask name app route methods POST def foo data json loads request data do some stuff return OK 现在另
  • 自定义龙目岛超级构建器

    我有一个父抽象类 Parent 和子类 Child 我正在使用 SuperBuilder 生成构建器 API 现在 我想对 Parent 和 Child 类的成员执行一些验证 作为构建的一部分 我找不到任何解决方案来自定义龙目岛超级构建器
  • 使用 C API 创建自定义类对象的 numpy 数组

    使用 C API 我想创建一个包含类型对象的 numpy 数组Quaternion 这是我用 C 编写的一个类 我已经有一个数组 实际上是一个std vector 并且我想制作一个副本 或者如果可能的话使用相同的内存 由于这不是基本类型 我