首页 > 解决方案 > 如何广播 sympy lambdify 生成的函数?

问题描述

我想计算一个 Sympy 表达式作为其中两个符号的函数。一个有 1 个变量的函数可以很容易地在 lambdifying 后被广播:

x, y, z = symbols('x y z')
expr = x*y + z
f = lambdify(x, expr.subs({z:2, y:4}))
x = np.linspace(1, 4, 5)
f(x)

但是有没有办法使用 numpy 或 sympy 的一些内置功能来进行更高维度的广播?换句话说,是否有更直接或更清洁的方法来执行以下操作?

x, y, z = symbols('x y z')
expr = x*y + z
f = lambdify([x, y], expr.subs({z:2}))
def g(xy):
    k = xy.shape[1]
    a = np.ndarray((k,k))
    for j in range(k): 
        for i in range(k):
            a[j, i] = f(xy[0, j], xy[1, i])
    return a

            
x = np.linspace(0, 4, 5)
y = np.linspace(10, 12, 5)
xy = np.array([x,y])  
g(xy)

标签: python-3.xnumpysympy

解决方案


您只需要获得适合广播的形状:

In [11]: x, y, z = symbols('x y z')
    ...: expr = x*y + z
    ...: f = lambdify([x, y], expr.subs({z:2}))

In [12]: x = np.linspace(0, 4, 5).reshape((5, 1))

In [13]: y = np.linspace(10, 12, 5)

In [14]: f(x, y)
Out[14]: 
array([[ 2. ,  2. ,  2. ,  2. ,  2. ],
       [12. , 12.5, 13. , 13.5, 14. ],
       [22. , 23. , 24. , 25. , 26. ],
       [32. , 33.5, 35. , 36.5, 38. ],
       [42. , 44. , 46. , 48. , 50. ]])

推荐阅读