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

我想使用Numba装饰多重积分的被积分,以便SciPy的Nquad函数可以将其作为LowLevelCallable进行调用。理想情况下,装饰器应允许使用任意数量的变量,以及Nquad的args参数中任意数量的其他参数。这是基于出色的Q&A from earlier this year构建而成的,但是扩展到了多个变量和参数的情况。

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

以下代码有效,但仅适用于两个变量和两个参数(N = 2,K = 2)。它不适用于更一般的情况。这是因为装饰器中的某些参数是手动枚举的(包装函数内部的xx [0],xx [1],xx [2],xx [3])。装饰器将必须针对每个不同数量的变量或参数进行编辑。如果可能的话,我想避免这种情况。注意,被积函数本身利用了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)

Numba documents引用一个carray函数,当在回调中提供低级指针和数组大小时,该函数应返回Numpy数组。可能的是,这可以用于推广超出二变量二参数情况的代码。我(未成功)尝试实现这一点的是在两行注释掉的代码行中。

帮助将不胜感激。的确,一位Numba开发人员pointed out认为SciPy集成是编写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)

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何用边界条件求解微分方程,其中之一是使用python的不等式 - python

可以设置psi(z> L)<eps?我有一个系统:dD/dz = .... dPsi/dz = .... 和边界条件:D(0) = 1,6*Pi Psi(z>L) < eps 我读到有关scipy.integrate.solve_bvp和odeint的信息,但所有示例都具有如下边界条件:y(0) = y(1) = 0有谁知道如何设置这…