如何使用 Numba 在 SciPy 中使用任意数量的变量和参数执行多重积分?

2024-03-14

我想用Numba修饰多重积分的被积函数,以便可以通过以下方式调用它SciPy Nquad功能作为低级可调用。理想情况下,装饰器应允许任意数量的变量以及来自 Nquad 的任意数量的附加参数args争论。这是建立在一个优秀的今年早些时候的问答 https://stackoverflow.com/questions/49683653/how-to-pass-additional-parameters-to-numba-cfunc-passed-as-lowlevelcallable-to-s,但扩展到多个变量和参数的情况。

作为示例,假设以下具有 N 个变量和 K 个参数的多重积分:

以下代码有效,但仅适用于两个变量和两个参数 (N=2,K=2)。它不适用于更一般的情况。这是因为装饰器中的一些参数是手动枚举的(xx[0],xx[1],xx[2],xx[3]在装饰器中wrapped功能)。必须针对每个不同数量的变量或参数来编辑装饰器。如果可能的话,我想避免这种情况。请注意,被积函数函数本身利用了 Numpy 对象和方法,因此不存在这个问题。

import numpy as np
import scipy.integrate as si
import numba
from numba import cfunc,carray
from numba.types import intc, CPointer, float64
from scipy import LowLevelCallable

def jit_integrand_function(integrand_function):
    jitted_function = numba.jit(integrand_function, nopython=True)

    @cfunc(float64(intc, CPointer(float64)))
    def wrapped(n, xx):
        return jitted_function(xx[0], xx[1], xx[2], xx[3])
        #xx = carray(xx,len(xx))
        #return jitted_function(xx)
    return LowLevelCallable(wrapped.ctypes)

@jit_integrand_function
def integrand(*args):
    d = np.array([args])
    return -np.exp(d.prod())

#Two variable, two parameter example
parms = np.array([2,3])
print si.nquad(integrand,[[0,1],[0,1]],parms)

理想的代码应该只使用一个装饰器被积函数还可以运行的函数:

#Three variable, three parameter example
parms2 = np.array([1,2,3])
print si.nquad(integrand,[[0,1],[0,1],[0,1]],parms2)

努巴文件 http://numba.pydata.org/numba-doc/dev/user/cfunc.html#dealing-with-pointers-and-array-memory参考一个carray http://numba.pydata.org/numba-doc/dev/reference/utils.html#numba.carray当在回调中给定低级指针和数组大小时,该函数应该返回 Numpy 数组。也许,这可以用于将代码推广到二变量二参数情况之外。我(不成功的)尝试实现这一点是在两行注释掉的代码中。

如有帮助,将不胜感激。事实上,Numba 开发人员之一指出 https://groups.google.com/a/continuum.io/forum/#!topic/numba-users/teVqeKWnJl4SciPy 集成是编写 Numba 的原因之一,但缺乏该领域的文档和示例。


以下代码有效:

import numpy as np
import scipy.integrate as si
import numba
from numba import cfunc,carray
from numba.types import intc, CPointer, float64
from scipy import LowLevelCallable

def jit_integrand_function(integrand_function):
    jitted_function = numba.jit(integrand_function, nopython=True)
    @cfunc(float64(intc, CPointer(float64)))
    def wrapped(n, xx):
        values = carray(xx,n)
        return jitted_function(values)
    return LowLevelCallable(wrapped.ctypes)

@jit_integrand_function
def integrand(args):
    return -np.exp(args.prod())

#Two variable, two parameter example
parms = np.array([2,3])
print si.nquad(integrand,[[0,1],[0,1]],parms)

#Three variable, three parameter example
parms2 = np.array([1,2,3])
print si.nquad(integrand,[[0,1],[0,1],[0,1]],parms2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Numba 在 SciPy 中使用任意数量的变量和参数执行多重积分? 的相关文章

随机推荐

  • 使用 Automapper 中的 Profiles 将相同类型映射到不同逻辑

    我在 ASP NET MVC 网站中使用 AutoMapper 将数据库对象映射到 ViewModel 对象 并且尝试使用多个配置文件来映射相同的类型 但使用另一种逻辑 我有通过阅读来做到这一点的想法马特的博客文章 http mhinze
  • 将目录拆分为子模块

    我在这里进行了很好的搜索 但似乎没有任何东西可以回答我的问题 所以就这样吧 我有一个具有当前文件夹结构的 git 存储库 app folder app folder2 app bundles bundle1 app bundles bund
  • 如何使用 Python 查找 Windows 通用应用程序数据文件夹?

    我希望我的应用程序存储一些数据以供所有用户访问 使用Python 我怎样才能找到数据应该去哪里 如果您不想添加像 winpaths 这样的第三方模块的依赖项 我建议使用 Windows 中已有的环境变量 Windows 中有哪些可用的环境变
  • 根据某些条件登录到不同的文件

    我们有一个应用程序 其中我们有一个条件 根据条件 如果条件为真 那么我们会将一些日志消息写入一个文件 否则我们会将消息记录到另一个文件 并且日志记录应该根据条件而不是根据日志级别进行 dropwizard 如何使用 yaml 文件 这是开箱
  • 什么是 __NSArrayI 和 __NSArrayM?如何转换为NSArray?

    什么是 NSArrayI 和 NSArrayM NSArrayI 或M 导致 无法识别的选择器 错误 如何转换为NSArray 我做了测试来解析 json twitter api gt 工作正常 解析的对象是 NSCFDictionary
  • 用于删除 unbox_any 的抖动逻辑

    我正在调查此 C 代码的执行 public static void Test
  • 想要将网站密码加密从 SHA1 转换为 SHA256

    只是寻求一些建议 我有一个大约有 2500 名用户的网站 规模虽小但正在不断增长 我通过对密码使用 SHA1 加密来构建它 我已经了解到 SHA1 是不安全的 并且想更改为带有盐的 SHA256 有人对如何进行这样的过渡有任何建议吗 如果我
  • H2O 和 Scikit-Learn 指标评分之间有什么区别吗?

    我尝试使用H2O创建一些用于二元分类问题的机器学习模型 测试结果非常好 但后来我查了一下 发现了一些奇怪的事情 出于好奇 我尝试打印测试集模型的预测 我发现我的模型实际上一直预测为 0 负 但 AUC 在 0 65 左右 并且精度不是 0
  • Rails 7 注册表单不显示错误消息

    我正在关注一个导轨教程 https www learnenough com ruby on rails 6th edition tutorial sign up sec signup form 在注册表单中 如果提交了无效的用户信息 注册页
  • 如何向“ng-disabled”添加多个条件?

    我需要检查两个条件bothtrue 在启用按钮之前 这是一个例子
  • 将子 DIV 拉伸到父级的高度(没有硬编码高度)

    我有一个父级 DIV 和一个子级 DIV 我希望将其拉伸到父级的底部 目前还没有 尽管有height auto important 可以看到说明问题的屏幕截图here https i stack imgur com bJ4qt jpg 相关
  • 将选择的 GFS-ensemble openDAP 数据加载到内存中 (Python)

    我想通过 netCDF 和 xarray 从 OpenDAP 服务器下载 GFS 集合数据的子选择 但是 当尝试将子选择加载到内存中时 程序会在一段时间后崩溃并返回 RuntimeError netCDF I O 故障 我希望获取的数据点数
  • pylint 警告“例外:”

    对于这样的块 try some stuff except Exception pass pylint 引发警告 W0703 捕获 异常 为什么 通常不捕获根 Exception 对象 而是捕获更具体的对象 例如 IOException 这被
  • numpy 二进制光栅图像到多边形转换

    我想将 2d numpy 数组转换为多边形 性能对我来说非常重要 但我想避免进行 C 扩展 可以通过腐蚀来制作二值轮廓图像 然后我发现this https stackoverflow com questions 6282462 conver
  • 不再需要视图时取消事件委托的最佳方法

    打电话是一种不好的做法吗undelegateEvents 在视图中remove 方法 为什么骨干人员没有默认包含它 我意识到 当简单地重新初始化视图变量时 我陷入了很多绑定问题 虽然undelegateEvents 创建新视图时会自动调用
  • .Net 4.0 JSON序列化:双引号改为\"

    我正在使用 System Web Script Serialization JavaScriptSerializer 将字典对象序列化为 JSON 字符串 我需要将此 JSON 字符串发送到云端的 API 但是 当我们序列化它时 序列化程序
  • x86_64:IMUL 比 2x SHL + 2x ADD 更快吗?

    当查看 Visual Studio 2015U2 生成的程序集时 O2 发布 模式我看到这段 手工优化 的 C 代码被翻译回乘法 int64 t calc int64 t a return a lt lt 6 a lt lt 16 a 集会
  • Silverlight 项目 - 滑入和滑出面板 - 如何?

    我不知道这个功能到底是什么 但我想在我的 Silverlight 项目中模拟它 我是一名 C 开发人员 正在转向 Silverlight 和 Expression Studio Blend 以获得更丰富的用户体验 假设我有一些用户控件 并希
  • 如何创建循环百分比(处理)[c#]

    示例 做某事 9999 次 可能超过 for int i 1 i lt 9999 i do something label1 content 100 i 9999 我想在编译时显示 label1 上的循环百分比 我无法在几毫秒内执行任何操作
  • 如何使用 Numba 在 SciPy 中使用任意数量的变量和参数执行多重积分?

    我想用Numba修饰多重积分的被积函数 以便可以通过以下方式调用它SciPy Nquad功能作为低级可调用 理想情况下 装饰器应允许任意数量的变量以及来自 Nquad 的任意数量的附加参数args争论 这是建立在一个优秀的今年早些时候的问答