将每个元素映射到表达式

3

I have this code:

import sympy
import numpy as np
from sympy.utilities.lambdify import lambdify
from collections import OrderedDict

arr = [np.array([ 1, 2]), np.array([ 5, 6])]
a,b = sympy.symbols('a b')
var = [a,b]
expr = ['a+cos(b)', 'a+cos(b)*2']

f = lambdify( var, expr, 'numpy')

vals = OrderedDict(zip(var, arr)).values()
f(*vals)

我收到了以下内容:

[array([ 1.28366219,  2.96017029]), array([ 1.56732437,  3.92034057])]

我希望收到:

[array([ 1.28366219,  3.92034057])]

因此:

1+np.cos(5) = 1.28366219

2 +np.cos(6)*2 = 3.92034057

注:该内容涉及IT技术,未进行进一步解释。
1个回答

2

考虑到您实现的f方式,我认为获取所需的输出的唯一途径是直接访问所需的元素。当您传递ab值时,f中的两个表达式将被评估并作为列表返回(如您所定义)。您可以检查f.func_doc

f.func_doc
"Created with lambdify. Signature:\n\nfunc(a, b)\n\nExpression:\n\n['a+cos(b)', 'a+cos(b)*2']"

然后
f(1, np.pi)

返回值

[0.0, -1.0]

正如预期的那样,其中0.0对应于a+cos(b)-1.0对应于a+cos(b)*2

在您的示例中,您可以简单地执行以下操作:

[vali[i] for i, vali in enumerate(f(*vals))]

这将给你所需的输出结果:

[1.2836621854632262, 3.9203405733007317]

我猜分别定义这些表达式会比你目前的列表更容易,但我不知道你选择这种结构的原因:
from sympy import cos

f1 = lambdify((a, b), a+cos(b))
f2 = lambdify((a, b), a+cos(b)*2)

res = [np.array([f1(1, 5), f2(2, 6)])]

这提供了

[array([ 1.28366219,  3.92034057])]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接