2016-03-31 29 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)