2016-03-31 32 views
1

我使用lambdify來編譯一個表達式,該表達式是某些參數的函數。每個參數有N點。所以我需要評估表達N次。下面顯示了一個關於如何完成的簡化示例。Python 3:Sympy:包含列表信息以優化lambdify

import numpy as np 
from sympy.parsing.sympy_parser import parse_expr 
from sympy.utilities.lambdify import lambdify, implemented_function 
from sympy import S, Symbol 
from sympy.utilities.autowrap import ufuncify 


def CreateMagneticFieldsList(dataToSave,equationString,DSList): 

    expression = S(equationString) 
    numOfElements = len(dataToSave["MagneticFields"]) 

    #initialize the magnetic field output array 
    magFieldsArray = np.empty(numOfElements) 
    magFieldsArray[:] = np.NaN 

    lam_f = lambdify(tuple(DSList),expression,modules='numpy') 
    try: 
     for i in range(numOfElements): 
      replacementList = np.zeros(len(DSList)) 


      for j in range(len(DSList)): 
       replacementList[j] = dataToSave[DSList[j]][i] 

      try: 
       val = np.double(lam_f(*replacementList)) 

      except: 
       val = np.nan 
      magFieldsArray[i] = val 
    except: 
     print("Error while evaluating the magnetic field expression") 
    return magFieldsArray 


list={"MagneticFields":list(range(10000)), "Chx":list(range(10000))} 

out=CreateMagneticFieldsList(list,"MagneticFields*5+Chx",["MagneticFields","Chx"]) 

print(out) 

有沒有方法可以進一步優化此調用?具體來說,我的意思是有沒有辦法讓lambdify包括我正在計算的點列表,以便循環評估可以優化?

+0

當您使用帶有modules =「numpy」的lambdify時,它會創建一個numpy表達式。您應該能夠將numpy數組作爲參數傳遞給您的lambdified函數,並且表達式將被矢量化爲它們。 – asmeurer

+0

@asmeurer感謝您的信息!我會嘗試的! –

回答

1

感謝@asmeurer,他給出瞭如何去做的想法。

由於lambdify是使用numpy編譯的,因此可以簡單地將列表作爲參數傳遞!以下是一個工作示例

#!/usr/bin/python3 

import numpy as np 
from sympy.parsing.sympy_parser import parse_expr 
from sympy.utilities.lambdify import lambdify, implemented_function 
from sympy import S, Symbol 
from sympy.utilities.autowrap import ufuncify 


def CreateMagneticFieldsListOpt(dataToSave,equationString,DSList): 

    expression = S(equationString) 
    numOfElements = len(dataToSave["MagneticFields"]) 

    #initialize the magnetic field output array 
    magFieldsArray = np.empty(numOfElements) 
    magFieldsArray[:] = np.NaN 

    lam_f = lambdify(tuple(DSList),expression,modules='numpy') 
    replacementList = [None]*len(DSList) 

    for j in range(len(DSList)): 
     replacementList[j] = np.array(dataToSave[DSList[j]]) 
    print(replacementList) 

    magFieldsArray = np.double(lam_f(*replacementList)) 


    return magFieldsArray 

list={"MagneticFields":[1,2,3,4,5],"ChX":[2,4,6,8,10]} 

out=CreateMagneticFieldsListOpt(list,"MagneticFields*5+ChX",["MagneticFields","ChX"]) 

print(out)