使用 numexpr 创建可调用对象



我正在用sympy做一些符号数学运算,然后使用eval和sympy的lambdastr实用程序生成Python lambda函数。下面是我的意思的简化示例:

import sympy
import numpy as np
from sympy.utilities.lambdify import lambdastr
# simple example expression (my use-case is more complex)
expr = sympy.S('b*sqrt(a) - a**2')
a, b = sorted(expr.free_symbols, key=lambda s: s.name)
func = eval(lambdastr((a,b), expr), dict(sqrt=np.sqrt))
# call func on some numpy arrays
foo, bar = np.random.random((2, 4))
print func(foo, bar)

这有效,但我不喜欢使用 eval ,并且 sympy 不一定生成计算高效的代码。相反,我想使用 numexpr ,它似乎非常适合这个用例:

import numexpr
print numexpr.evaluate(str(expr), local_dict=dict(a=foo, b=bar))

唯一的问题是我想生成一个可调用对象(如 lambda func),而不是每次都调用 numexpr.evaluate。这可能吗?

您可以使用

lambdify模块,该模块允许您将 SymPy 表达式转换为 lambda 函数以实现高效计算。这很好,因为它能够返回带有附加实现的函数。

Lambdify自己的函数可能如下所示:

func = lambdify((a,b),expr, dict(sqrt=np.sqrt))

相关内容

  • 没有找到相关文章

最新更新