该文档讨论了使用numba的cfunc
作为的LowLevelCallable
参数scipy.integrate.quad
。我需要带有附加参数的相同内容。
我基本上是想做这样的事情:
import numpy as np
from numba import cfunc
import numba.types
voidp = numba.types.voidptr
def integrand(t, params):
a = params[0] # this is additional parameter
return np.exp(-t/a) / t**2
nb_integrand = cfunc(numba.float32(numba.float32, voidp))(integrand)
但是,它不起作用,因为params
应该是voidptr
/void*
并且不能将它们转换为double
。我收到以下错误消息:
TypingError: Failed at nopython (nopython frontend)
Invalid usage of getitem with parameters (void*, int64)
* parameterized
我没有找到有关如何从void*
Numba中提取值的任何信息。在C语言中,应该类似于a = *((double*) params)
—在Numba中可以做同样的事情吗?
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 np
import scipy.integrate as si
import numba
from numba import cfunc
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])
return LowLevelCallable(wrapped.ctypes)
@jit_integrand_function
def integrand(t, *args):
a = args[0]
return np.exp(-t/a) / t**2
def 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 np
from numba import cfunc
import numba.types
def get_integrand(*args):
a = args[0]
def integrand(t):
return np.exp(-t/a) / t**2
return integrand
nb_integrand = cfunc(numba.float64(numba.float64))(get_integrand(2.))
import scipy.integrate as si
def 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
似乎也不鼓励!
问题内容: 我在Django应用程序中有一个用户注册表格,该表格收集用户尝试注册时的其他数据,例如地址,城市,国家/地区,电话号码等。 该数据通过信号保存在“帐户”模型类中。用户创建过程如下所示: 在这里,当用户发布表单时将调用该函数,在该函数下,我可以获得POST数据,我想要的是将该数据传递给方法,以便其填充模型中的字段。 现在,我确实看到了在数据库中创建的对象,但是除用户字段之外的所有字段均为
问题内容: 我正在创建一种通过传递搜索字段从任何表中选择ID的方法。 但是我得到一个有关语法错误的MySqlException。当我查看“异常”消息时,它向我显示带引号的查询表!如何将表格作为不带引号的参数传递? 问题答案: 大多数数据库不允许您通过参数指定表名或列名。参数用于 值 。如果确实确实需要使它动态化,则应验证输入(它应该是一个已知的表名,并且该表中具有已知的列名),然后将其包括在SQL
问题内容: 我正在A中使用RUN指令安装rpm 但是,我想将值“ 2.3”作为参数传递。我的RUN指令应类似于: 哪里 问题答案: 您正在寻找和指导。这些是Docker 1.9中的新功能。查看https://docs.docker.com/engine/reference/builder/#arg。这将允许您添加到,然后使用构建。
问题内容: 我已经熟悉Android框架和Java,并希望创建一个通用的“ NetworkHelper”类,该类可以处理大多数联网代码,使我能够从中调用网页。 我遵循了来自developer.android.com的这篇文章来创建我的网络类:http : //developer.android.com/training/basics/network- ops/connecting.html 码:
问题内容: 我正在使用Go内置的http服务器,并拍拍来响应一些URL: 我需要向该处理函数传递一个额外的参数-一个接口。 如何向处理程序函数发送额外的参数? 问题答案: 通过使用闭包,您应该能够做您想做的事情。 更改为以下内容(未测试): 然后对
我在解一个有很多常数的非线性方程 我创建了一个用于解决以下问题的函数: 然后我想做: 但是正在解包并向函数传递太多参数,因此我得到: TypeError:terminalV()正好接受2个参数(给定6个) 那么,我的问题是,我是否可以通过某种方式将元组传递给调用的函数?