栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将其他参数传递给作为LowLevelCallable传递给scipy.integrate.quad的numba cfunc

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将其他参数传递给作为LowLevelCallable传递给scipy.integrate.quad的numba cfunc

1.通过传递额外的参数

scipy.integrate.quad

quad
文件说:

如果用户希望改善集成性能,则

f
可以使用
scipy.LowLevelCallable
以下签名之一:

double func(double x)

double func(double x, void *user_data)

double func(int n, double *xx)

double func(int n, double *xx, void *user_data)

user_data
是包含在该数据
scipy.LowLevelCallable
。在与该呼叫的形式
xx
n
是的长度
xx
包含阵列
xx[0]== x
所述物品的其余部分都包含在数字
args
的论点
quad

因此,要将额外的参数传递给

integrand
through
quad
,最好使用
double func(int n, double *xx)
签名。

您可以将一个装饰器写入被积分函数,以将其转换为

LowLevelCallable
类似形式:

import numpy as npimport scipy.integrate as siimport numbafrom numba import cfuncfrom 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])    return LowLevelCallable(wrapped.ctypes)@jit_integrand_functiondef integrand(t, *args):    a = args[0]    return np.exp(-t/a) / t**2def do_integrate(func, a):    """    Integrate the given function from 1.0 to +inf with additional argument a.    """    return si.quad(func, 1, np.inf, args=(a,))print(do_integrate(integrand, 2.))>>>(0.326643862324553, 1.936891932288535e-10)

或者,如果您不需要装饰器,请

LowLevelCallable
手动创建并将其传递给
quad

2.包装被积函数

我不确定以下内容是否满足您的要求,但是您也可以包装

integrand
功能以达到相同的结果:

import numpy as npfrom numba import cfuncimport numba.typesdef get_integrand(*args):    a = args[0]    def integrand(t):        return np.exp(-t/a) / t**2    return integrandnb_integrand = cfunc(numba.float64(numba.float64))(get_integrand(2.))import scipy.integrate as sidef do_integrate(func):    """    Integrate the given function from 1.0 to +inf.    """    return si.quad(func, 1, np.inf)print(do_integrate(get_integrand(2)))>>>(0.326643862324553, 1.936891932288535e-10)print(do_integrate(nb_integrand.ctypes))>>>(0.326643862324553, 1.936891932288535e-10)

3.从

voidptr
转换为python类型

我认为这还不可能。从2016年的讨论来看,似乎

voidptr
只是在这里将上下文传递给C回调。

void
*指针的情况适用于API,其中外来C代码并非每次都尝试取消对指针的引用,而只是将其传递回回调,以作为回调在两次调用之间保持状态的方式。我认为目前这不是特别重要,但是我想提出这个问题。

并尝试以下操作:

numba.types.RawPointer('p').can_convert_to(    numba.typing.context.Context(), CPointer(numba.types.Any)))>>>None

似乎也不鼓励!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/455744.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号