【问题标题】:Generate many SymPy expressions using the same symbols使用相同的符号生成许多 SymPy 表达式
【发布时间】:2014-06-20 09:48:19
【问题描述】:

我想使用同一组符号创建许多(超过 400 个)SymPy 表达式。表达式如下所示:

z_1_8 = k1 + k2 + kuni + k4 + k7
z_2_9_0 = k2 + k8 + k1 + k6
z_3_1_10 = k3 + kbi + k2 + k7

名称“z_1_8”将从列表中生成,其中列表的每个成员都包含命名每个表达式的数字。同样,符号也来自一个列表,其中每个成员都包含一个符号列表作为字符串 - 'k1''k2' 等 - 用于生成每个表达式。

list_to_generate_expression_names = [[1, 8], [2, 9, 0], [3, 1, 10],...]
list_to_generate_expressions = [['k1', 'k2','kuni','k4','k7'], ['k2', 'k8', 'k1', 'k6'], ['k3', 'kbi', 'k2', 'k7']]

有什么方法可以做到这一点?

【问题讨论】:

  • SymPy 变量 必须 动态创建(使用 var 函数),因此您可以执行 k = [var('k%d' % i) for i in range(10)] 之类的操作。
  • 谢谢。我的符号严格来说不会是一个 k 序列。我刚刚编辑了问题。
  • 通常使用symbols 比使用var 更好。
  • 你想生成sympy.Eq对象吗?
  • 我不确定这意味着什么。我对使用 SymPy 很陌生,对 python 的经验也不是很丰富。

标签: python sympy


【解决方案1】:

我在这里假设list_to_generate_expressions 中的每个字符串都是已经存在的对象的名称。如果是这种情况,并且您的列表匹配正确,您可以这样做:

names = ['z_' + '_'.join([str(n) for n in name_nums]) for name_nums in list_to_generate_expression_names]
exprs = ['+'.join(expr_items) for expr_items in list_to_generate_expressions]

for name, expr in zip(names,exprs):
    exec('{0} = {1}'.format(name,expr))

请注意,这确实使用了exec,应始终谨慎使用,但由于您使用的是自己的列表,因此非常安全。

【讨论】:

  • 非常感谢!这正是我想做的。使用 exec 有什么替代方法,只需了解选项是什么以及它在做什么?
  • 如果您通过 exec 运行的所有内容都是您知道安全的,那么就没有什么好担心的了。
  • 我认为在这样做之前,要在已经存在的对象的“list_to_generate_expressions”名称中创建字符串,我会将它们声明为 SymPy 符号?
  • 是的。如果你有一个字符串列表需要成为 sympy 符号,你可以这样做:for i in my_list : exec('{i} = Symbol("{i}")'.format(i=i))
  • 而不是exec,初始化一个字典z = {}应该允许在最终循环中使用z[name] = sympy.Eq(name, expr)之类的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2023-03-25
  • 2016-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多