首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3: Sympy:包括列表信息以优化lambdify

Python 3: Sympy:包括列表信息以优化lambdify
EN

Stack Overflow用户
提问于 2016-03-31 12:13:02
回答 1查看 141关注 0票数 1

我使用lambdify编译一个表达式,该表达式是某个参数的函数。每个参数都有N点。因此,我需要计算表达式的N时间。下面是一个简化的示例,说明如何做到这一点。

代码语言:javascript
复制
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包括我正在计算的点的列表,以便可以优化循环求值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 15:02:41

由于@asmeurer,他给出了如何做这件事的想法。

由于lambdify是使用numpy编译的,所以可以简单地将列表作为参数传递!下面是一个有用的示例

代码语言:javascript
复制
#!/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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36333150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档