我想使用Numba裝飾多重積分的被積分,以便SciPy的Nquad函數(shù)可以將它作為LowLevelCallable進行調用。理想情況下,裝飾器應允許使用任意數(shù)量的變量,以及Nquad的args參數(shù)中任意數(shù)量的其他參數(shù)。這是從今年初以來出色的問答環(huán)節(jié)建立的,但是擴展到了多個變量和參數(shù)的情況。例如,假設以下具有N個變量和K個參數(shù)的多重積分:以下代碼有效,但僅適用于兩個變量和兩個參數(shù)(N = 2,K = 2)。它不適用于更一般的情況。這是因為裝飾器中的某些參數(shù)是手動枚舉的(包裝函數(shù)內部的xx [0],xx [1],xx [2],xx [3] )。裝飾器將必須針對每個不同數(shù)量的變量或參數(shù)進行編輯。如果可能的話,我想避免這種情況。請注意,被積函數(shù)本身利用了Numpy對象和方法,因此不會出現(xiàn)此問題。import numpy as npimport scipy.integrate as siimport numbafrom numba import cfunc,carrayfrom 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], xx[2], xx[3]) #xx = carray(xx,len(xx)) #return jitted_function(xx) return LowLevelCallable(wrapped.ctypes)@jit_integrand_functiondef integrand(*args): d = np.array([args]) return -np.exp(d.prod())#Two variable, two parameter exampleparms = np.array([2,3])print si.nquad(integrand,[[0,1],[0,1]],parms)理想的代碼將只使用一個裝飾上積函數(shù)也運行:#Three variable, three parameter exampleparms2 = np.array([1,2,3])print si.nquad(integrand,[[0,1],[0,1],[0,1]],parms2)Numba文檔引用了carray函數(shù),在給定回調中的低級指針和數(shù)組大小時,該函數(shù)應返回Numpy數(shù)組??赡艿氖?,這可以用于推廣超出二變量二參數(shù)情況的代碼。我(未成功)嘗試實現(xiàn)這一點的是在兩行注釋掉的代碼行中。幫助將不勝感激。實際上,一位Numba開發(fā)人員指出SciPy集成是編寫Numba的原因之一,但是缺少該領域的文檔和示例。
添加回答
舉報
0/150
提交
取消