python-3.x - 如何广播 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)
解决方案
您只需要获得适合广播的形状:
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. ]])
推荐阅读
- php - Laravel - 特定字段的永久验证
- wordpress - 如何从邮递员那里获取未过期的 wordpress jwt 令牌以设置颤振电子商务配置文件?
- java - Css Selector 有特定的属性吗?
- laravel - 路线 [地图] 未定义
- java - IntelliJ - 无法导航到 JDK 目录
- scrapy - Scrapy 不会提取某些选择器中的文本
- java - Firebase RecyclerView 显示一项
- javascript - 如何让 React HighCharts 与 TypeScript 一起工作?
- python - Numpy子集/切片不返回预期值
- ruby - 计算多少次返回 true .include?红宝石