用numexpr创建一个callable

时间:2015-04-22 19:28:22

标签: python numpy sympy 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))

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

1 个答案:

答案 0 :(得分:2)

您可以使用lambdify模块,它允许您将SymPy表达式转换为lambda函数以进行有效计算。这很好用于返回具有附加实现的函数。

Lambdify你自己的功能看起来像这样:

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