Ich verwende lambdify
, um einen Ausdruck zu kompilieren, der eine Funktion bestimmter Parameter ist. Jeder Parameter hat N
Punkte. Also muss ich den Ausdruck N
mal auswerten. Im Folgenden wird ein vereinfachtes Beispiel für die Vorgehensweise gezeigt.Python 3: Sympy: Listeninformationen zur Optimierung von Lambdify hinzufügen
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)
Gibt es eine Möglichkeit, diesen Anruf weiter zu optimieren? Genauer gesagt, ich meine, gibt es eine Möglichkeit, lambdify
Include zu machen, die ich für eine Liste von Punkten berechne, so dass die Loop-Evaluierung optimiert werden kann?
Wenn Sie lambdify mit modules = "numpy" verwenden, wird ein anonymer Ausdruck erstellt. Sie sollten in der Lage sein, numpy arrays als Argumente für Ihre Lambda-Funktion zu übergeben, und der Ausdruck wird über sie vektorisiert. – asmeurer
@asmeurer Danke für die Info! Ich werde es versuchen! –