小编Abo*_*ogo的帖子

当函数将数组作为参数时,如何使用 Numba 对函数进行矢量化?

我想使用Numba来矢量化一个函数,该函数将评估矩阵的每一行。这基本上会将 Numpy ufunc 应用于矩阵,而不是循环遍历行。根据文档

你可能会问自己,“为什么我要经历这个而不是使用 @jit 装饰器编译一个简单的迭代循环?”。答案是 NumPy ufunc 会自动获得其他功能,例如减少、累积或广播。

考虑到这一点,我什至无法让一个玩具示例起作用。下面的简单示例尝试计算每行中元素的总和。

import numba, numpy as np

# Define the row-wise function to be vectorized:
@numba.guvectorize(["void(float64[:],float64)"],"(n)->()")
def f(a,b):
    b = a.sum() 

# Apply the function to an array with five rows:
a = np.arange(10).reshape(5,2)
b = f(a)   
Run Code Online (Sandbox Code Playgroud)

我使用了@guvectorize装饰器,因为我希望装饰函数将参数a作为矩阵的每一行,这是一个数组;@vectorize只接受标量输入。我还编写了签名以获取数组参数并修改标量输出。根据docs,装饰函数不使用 return 语句。

结果应该是b = [1,5,9,13,17],但我得到了b=[0.,1.,2.,3.,4.]。显然,我错过了一些东西。我很感激一些方向,请记住,总和只是一个例子。

python numpy scipy numba

7
推荐指数
2
解决办法
2747
查看次数

如何使用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

numpy ×2

python ×2

scipy ×2