【问题标题】:map each element to expression将每个元素映射到表达式
【发布时间】:2017-03-05 21:28:33
【问题描述】:

我有这个代码:

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

【问题讨论】:

    标签: python numpy sympy


    【解决方案1】:

    鉴于您实现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])]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2023-01-19
      相关资源
      最近更新 更多