为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_笑_17 2021-04-06 10:19:45
我想使用Numba装饰多重积分的被积分,以便SciPy的Nquad函数可以将它作为LowLevelCallable进行调用。理想情况下,装饰器应允许使用任意数量的变量,以及Nquad的args参数中任意数量的其他参数。这是从今年初以来出色的问答环节建立的,但是扩展到了多个变量和参数的情况。例如,假设以下具有N个变量和K个参数的多重积分:以下代码有效,但仅适用于两个变量和两个参数(N = 2,K = 2)。它不适用于更一般的情况。这是因为装饰器中的某些参数是手动枚举的(包装函数内部的xx [0],xx [1],xx [2],xx [3] )。装饰器将必须针对每个不同数量的变量或参数进行编辑。如果可能的话,我想避免这种情况。请注意,被积函数本身利用了Numpy对象和方法,因此不会出现此问题。import numpy as npimport scipy.integrate as siimport numbafrom numba import cfunc,carrayfrom numba.types import intc, CPointer, float64from scipy import LowLevelCallabledef 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_functiondef integrand(*args):    d = np.array([args])    return -np.exp(d.prod())#Two variable, two parameter exampleparms = np.array([2,3])print si.nquad(integrand,[[0,1],[0,1]],parms)理想的代码将只使用一个装饰上积函数也运行:#Three variable, three parameter exampleparms2 = np.array([1,2,3])print si.nquad(integrand,[[0,1],[0,1],[0,1]],parms2)Numba文档引用了carray函数,在给定回调中的低级指针和数组大小时,该函数应返回Numpy数组。可能的是,这可以用于推广超出二变量二参数情况的代码。我(未成功)尝试实现这一点的是在两行注释掉的代码行中。帮助将不胜感激。实际上,一位Numba开发人员指出SciPy集成是编写Numba的原因之一,但是缺少该领域的文档和示例。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 354 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号