我很好奇使用sympy
函數編寫程序(如autowrap
)來創建一個函數,陣列輸入的正確方法的功能。使用sympy編譯與數組參數
隨着lambdify
,我可以做這些的任一個:)
import numpy as np
import sympy as sp
x, y, a,b = sp.symbols('x,y,a,b')
f=a*x**2 + b*y**3
甲
L1 = sp.lambdify([x,y,a,b],f)
v1=np.array([1,2])
v2=np.array([3,4])
L1(*np.concatenate([v1,v2]))
35
B)
M1=sp.Matrix([x,y])
M2=sp.Matrix([a,b])
L2 = sp.lambdify([M1,M2],f)
L2(v1,v2)
35
大概在引擎蓋下(B)和(A)是一樣的。
但與autowrap
我只有選項A據我所知。
from sympy.utilities.autowrap import autowrap
A1 = autowrap(f,args=[x,y,a,b],backend='cython')
A1(*np.concatenate([v1,v2]))
35.0
A2 = autowrap(f,args=[M1,M2],backend='cython')
CodeGenArgumentListError: ("Argument list didn't specify: a, b, x, y ", [InputArgument(a), InputArgument(b), InputArgument(x), InputArgument(y)])
有沒有辦法做到這一點?我的用例是編譯ODE模擬的dy/dx函數。該函數(比上面的例子要複雜得多)需要採用一組x值和一組參數。現在我正在使用上面的代碼,np.concatenate
和python list擴展,如果我剖析代碼,連接實際上需要比計算更多的時間。所以,我很想得到它周圍,並有sympy採取的最後一條語句,並生成C代碼,看起來像
double f(double* M1,double* M2) {
return M1[0]*pow(M2[0],2)+M1[1]*pow(M2[1],3)
}
想必那麼numpy的陣列可以得到直接傳遞。
這可能嗎?有一個更好的方法嗎?或者我是否在這裏過度/過度優化?
我不是100%肯定,但是這可能是HTTPS的副本: //stackoverflow.com/questions/35430479/convert-sympy-expressions-to-function-of-numpy-arrays。 – asmeurer
您還可能有興趣在https://github.com/sympy/sympy/pull/10640 – asmeurer
你是絕對正確的,這個問題是問同樣的事情。看起來好像沒有完美的解決方案,但我會研究在github線程中鏈接的示例。 –