Cython:将扩展类型序列作为另一个扩展类型的属性,可以访问 cdef 方法

2024-03-29

假设我定义了以下 Cython 类

cdef class Kernel:
    cdef readonly double a

    def __init__(self, double a):
        self.a = a

    cdef public double GetValue(self, double t):
        return self.a*t 

现在我想定义另一个具有内核序列作为属性的扩展类型。就像是:

cdef class Model:
    cdef readonly Kernel[:] kernels
    cdef unsigned int n_kernels

    def __init__(self, Kernel[:] ker):
        self.kernels = ker
        self.n_kernels = ker.shape[0]

    cdef double Run(self, double t):

        cdef int i
        cdef double out=0.0

        for i in range(self.n_kernels):
            out += self.kernels[i].GetValue(t)

        return out

然而,这不起作用。首先我需要替换Kernel[:]with object[:],否则我会收到以下错误gcc

‘PyObject’ has no member named ‘__pyx_vtab’

如果我使用object[:]一切编译正常,但在尝试访问时出现错误GetValuemethod:

AttributeError: "AttributeError: "'cytest.Kernel' object has no attribute 'GetValue'" in 'cytest.Model.Run'

我想要什么

  1. 访问cdef的方法Kernel来自cdef method Run,没有 Python 开销。
  2. 对内核元素进行类型检查。

我目前的解决方法

目前我使用以下解决方案,但不满足上述要求:

cdef class Kernel:
    cdef readonly double a

    def __init__(self, double a):
        self.a = a

    cpdef public double GetValue(self, double t):
        return self.a*t 

cdef class Model:
    cdef readonly object[:] kernels
    cdef unsigned int n_kernels

    def __init__(self, object[:] ker):
        self.kernels = ker
        self.n_kernels = ker.shape[0]

    def Run(self, double t):

        cdef int i
        cdef double out=0.0

        for i in range(self.n_kernels):
            out += self.kernels[i].GetValue(t)

        return out

即我将 Kernel 类的方法声明为cpdef以便可以从 Python 访问它们并使用object[:].

Question

有没有办法在 Cython 中实现上述第 1 点和第 2 点而不需要 Python 开销?

在此先感谢您的时间。

注意:我事先不知道序列的长度。

Edit

根据@DavidW的建议,我修改了代码如下

# module cytest
import cython

cdef class Kernel:
    cdef readonly double a

    def __init__(self, double a ):
        self.a = a

    cdef public double GetValue(self, double t):
        return self.a*t


cdef class Model:
    cdef readonly Kernel[:] kernels
    ### added this attribute 
    cdef Kernel k 
    cdef unsigned int n_kernels

    def __cinit__(self, Kernel[:] ker):
        self.kernels = ker
        self.n_kernels = ker.shape[0]

    cpdef double Run(self, double t):

        cdef int i
        cdef double out=0.0

        for i in range(self.n_kernels):
            # now i assign to the new attribute each time 
            # and access the cdef method from it
            self.k = self.kernels[i]
            out += self.k.GetValue(t)

        return out

现在它编译并运行良好(并且比我以前的解决方法更快),即使我在访问时仍然有一些 python 开销Kernel[:]属性。

我在这里举了一个构建和调用的示例Model

import cytest
import numpy as np

ker_list = [cytest.Kernel(i*1.0) for i in range(3)]

# transform it to a numpy array
# to be able to pass it to the 'Model' constructor
ker_arr = np.array(ker_list)

# create a model instance
model = cytest.Model(ker_arr)

# call the method Run
print model.Run(1.0)

None

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

Cython:将扩展类型序列作为另一个扩展类型的属性,可以访问 cdef 方法 的相关文章

  • 在python中打开带有重音符号的文本文件

    我尝试使用 Python 2 7 打开法语文本文件 我使用了命令 f open textfr r 但是当我使用 f read 我失去了重音字符 我明白了u J xc3 xa9tais xc3 xa0巴黎而不是J tais 巴黎等 当在lin
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort
  • Unpivot Pandas 数据

    我目前有一个DataFrame布置为 Jan Feb Mar Apr 2001 1 12 12 19 2002 9 2003 我想将数据 逆透视 使其看起来像 Date Value Jan 2001 1 Feb 2001 1 Mar 200
  • c++11 中的 std::thread 问题

    我在尝试从标准模板库编译具有多线程的程序时遇到一些麻烦 当我尝试编译以下程序时 它返回一个晦涩的错误 include
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 使用 MinGW 链接到 Python

    我不想创建一个嵌入Python解释器的跨平台程序 并用MinGW编译它 但是 Python 二进制发行版没有提供 MinGW 链接的库 仅python32 lib对于 Visual C 并且 Python 源包不提供使用 MinGW 编译的
  • 发生错误。", ExceptionMessage: "提供的 'HttpContent' 实例无效

    尝试将文件添加到 http 休息调用时出现此错误 responseJson 消息 发生错误 ExceptionMessage 提供了无效的 HttpContent 实例 它确实 正在使用 多部分 参数名称 内容 异常类型 System Ar
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 在 C# 中加密并在 Flex 中解密

    我需要解密 Flex 中的一些数据 这些数据是用 C 加密并写入文件的 为了简单起见 我选择使用 as3crypto As3 库和 Bruce Schneier C 库 AS3 as3加密链接 http code google com p
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 我可以在C中直接比较int和size_t吗?

    我可以比较一个int and a size t像这样的变量 int i 1 size t y 2 if i y Do something 或者我必须输入其中之一 只要满足以下条件 它就是安全的int为零或正数 如果它是负数 并且size t
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • 使 flake8 区分未定义函数和星型导入

    我有一个相当大的项目 我试图在发布之前清理它 但是当我运行 flake8 时 我得到了大量的 F405
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标
  • 重定向到破折号中的 url

    我正在使用 dash 构建一个仪表板 每当单击特定数据点时 我都会创建一个唯一的 url 如何将用户重定向到此创建的 url 我正在使用下面给出的代码 每当有人单击任何数据点时 单击事件就会触发并执行回调函数 app layout html

随机推荐

  • 如何在 GCP 中执行数据沿袭? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当我们使用GCP云存储实现数据湖 并使用Dataproc Dataflow等云服务进行数据处理时 我们如何在GCP中生成数据沿袭报告
  • 为什么 ERD 中不允许使用特定基数?

    在有关实体关系图的每个教程中 我都读到不允许为关系指定固定基数 只有对 ERD 的非正式评论才能澄清飞行员的数量exactly 2 因此 例如 航班和飞行员之间的关系 其中每个航班恰好有 2 名飞行员 必须表示为
  • 将 ValidationRules 绑定在一行中?

    我已经编写了几个单行绑定 如果可能并且仍然是人类可读的 我希望保持这种方式 有什么办法可以重写这个
  • Fork-Join 相关: join() vs get() vs invoke()

    我有必要使用吗join with fork 或者我也可以使用其中之一join get invoke 我检查了API http docs oracle com javase 7 docs api java util concurrent Fo
  • AutoMapper 具有来自 IDataReader 的列表数据

    using IDataReader dr DatabaseContext ExecuteReader command if dr Read AutoMapper Mapper CreateMap
  • 在 PHP 中通过用户 标签将一个页面链接到另一个页面

    这是我的海报代码在一页中 a href img href a 现在我想将其链接到另一个页面假设我单击 说 以获取 href mydomain com 1 它将重定向到另一个页面并播放该文件 该页面的代码是 if playlistitem l
  • RESTKit - 将大量对象发布到服务器

    如何使用 RESTKit 将对象数组发布到我的服务器 我有一个名为的自定义对象Contact它有一些属性 例如name phone等等 我想发送这些的数组Contact向服务器发送对象 我知道的方法是postObject path para
  • 在 swift 4 中自动关闭视图控制器

    假设我有 3 个ViewControllers标记为 A B 和 C 现在 A 是rootViewController窗口的形状 它以模态方式呈现 B 当点击 B 中的按钮时 应该立即以模态方式呈现 C 并自动关闭 B 我怎样才能做到这一点
  • 使用 pyqtgraph 有效地绘制大型数据集

    我正在尝试使用 pyqtgraph 生成散点图和直方图矩阵 每个散点图的输入 x 和 y 值 是长度大于 1 000 000 的 numpy 数组 生成这些图需要很长时间 2x2 绘图矩阵 gt 1 分钟 matplotlib 实际上生成相
  • ModuleNotFoundError:使用tensorflow 2.6时没有名为“keras”的模块

    我创建了一个新的 conda 环境 conda create name tf tensorflow 2 6 并尝试编译 import tensorflow as tf model tf keras models Sequential 导致
  • 如何设置组合框宽度以适合最大的项目

    我希望我的ComboBox必须适应其width到最长的String Item我的清单中 代码示例 ComboBox model Banana Apple ThisIsTheLongestWordThatIHave Coconut 知道如何做
  • Android 中写入锁定文件

    我将一些数据存储在 SD 卡上的文件上 并从不同的线程读取相同的文件 为了避免读取和写入的竞争条件 我想在两种情况下锁定文件 读取和写入 我心里有两个选择 1 我可以使用同步来做到这一点 2 我可以使用文件锁来做到这一点 我应该选择哪一个
  • 批量插入 mysql - 我可以使用忽略子句吗?有限制吗?批量插入的记录?

    我有一堆数据想要插入 我决定对 mysql 使用批量插入 插入朋友 请求者 好友 值 value1 value2 value2 value1 value3 value4 value4 value3 我想了解以下信息 1 我可以使用忽略吗 例
  • Json允许错误

    这个错误在我们的 MVC 应用程序中随机出现 有时做同样的事情不会 有时却会 有谁知道这是否与任何可以简单解决的问题有关 或者这是否是你们很多人都见过的常见现象 System InvalidOperationException This r
  • 注册 COM 互操作

    当选中构建属性中的 Register for COM Interop 选项时 出现错误 无法注册程序集访问 被拒绝 取消选中该选项时 项目构建时不会出现任何错误 但我的要求是注册 COM 对象 因为我需要在 VB 中使用相同的对象 谁能帮我
  • 与 WPF 和数据绑定一起使用的简单 CRUD

    我是用于 Windows 应用程序开发的 WPF 新手 只是想先将其介绍一下 我正在使用 Visual Studio 2010 和 NET Framework 4 0 我正在开发一个相当简单的管理工具 为了简单起见 假设我正在处理员工数据
  • 全屏嵌入 Bing 地图

    有人知道是否可以全屏嵌入 bing 地图吗 这样地图就可以始终填充背景并简单地在顶部覆盖一些元素 我似乎无法用 100 iframe 实现这一点 而且 bing 的帮助也没有那么有帮助 谢谢 如果我没理解错的话 你想要实现让地图填满整个屏幕
  • C11 结构继承与匿名结构

    I saw this way https stackoverflow com a 14523823 108802实施某种struct匿名继承struct在C11中 想尝试一下 这是我所拥有的 struct struct a int aa s
  • R - 查找行中的所有重复项并替换

    我有一个大数据框 正在尝试查找一行中的重复元素 然后用空字符串替换所有重复值 X1 X2 X3 X4 X5 x 1 2 3 3 4 y 1 1 2 3 4 应该成为 X1 X2 X3 X4 X5 x 1 2 4 y 2 3 4 我可以在单个
  • Cython:将扩展类型序列作为另一个扩展类型的属性,可以访问 cdef 方法

    假设我定义了以下 Cython 类 cdef class Kernel cdef readonly double a def init self double a self a a cdef public double GetValue s