相关疑难解决方法(0)

将 NumPy 数组作为参数传递给 numba.cfunc

我一直在与一个我无法解决的问题作斗争,因此不太知道如何开始解决它。我在C语言编程方面的经验非常有限,我认为这就是我无法取得进步的原因。

\n\n

我有一些函数使用numpy.interpscipy.integrate.quad来执行一定的积分。自从我使用quad集成,并且根据其文档:

\n\n
\n

要集成的 Python 函数或方法。如果func采用多个参数,则沿第一个参数对应的轴进行积分。

\n\n

如果用户希望提高集成性能,则f可能是\n scipy.LowLevelCallable之一:

\n\n
double func(double x)\ndouble func(double x, void *user_data) \ndouble func(int n, double *xx) \ndouble func(int n, double *xx, void *user_data) \n
Run Code Online (Sandbox Code Playgroud)\n\n

user_data 是包含在scipy.LowLevelCallable. 在 的调用形式中xx,是包含的数组n的长度xxxx[0] == x,其余项是quad 的 args 参数中包含的数字。

\n\n

此外,还支持某些 ctypes 调用签名以实现向后兼容,但这些签名不应在新代码中使用。

\n
\n\n

我需要使用这些scipy.LowLevelCallable对象来加速我的代码,并且我需要将我的函数设计坚持上述签名之一。此外,由于我不想使用 C 库和编译器使整个事情变得复杂,所以我想使用 中提供的工具“即时”解决这个问题numba,特别是numba.cfunc,这允许我绕过 Python C …

c python scipy python-3.x numba

7
推荐指数
1
解决办法
2950
查看次数

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

我想用Numba来装饰一个多重积分的积分,这样它就可以被SciPy的Nquad函数称为LowLevelCallable.理想情况下,装饰器应该允许任意数量的变量,以及来自Nquad的args参数的任意数量的附加参数.这是从今年早些时候开始的优秀问答,但扩展到多个变量和参数的情况.

例如,假设以下与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 = …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy numba

6
推荐指数
1
解决办法
1644
查看次数

标签 统计

numba ×2

python ×2

scipy ×2

c ×1

numpy ×1

python-3.x ×1