Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用相同的符号生成多个SymPy表达式_Python_Sympy - Fatal编程技术网

Python 使用相同的符号生成多个SymPy表达式

Python 使用相同的符号生成多个SymPy表达式,python,sympy,Python,Sympy,我想用同一组符号创建多个(超过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_expres

我想用同一组符号创建多个(超过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']]

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

我在这里假设,
列表中要生成表达式的每个字符串都是已经存在的对象的名称。如果是这种情况,并且列表正确匹配,则可以执行以下操作:

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
,应始终谨慎使用,但由于您使用的是自己的列表,因此非常安全。

SymPy变量必须动态创建(使用
var
函数),因此您可以对范围(10)内的i执行
k=[var('k%d'%i)]
之类的操作。谢谢。我的符号不是严格意义上的k序列。我刚刚编辑了这个问题。通常使用
symbols
var
更好。是否要生成
sympy.Eq
对象?我不确定这是什么意思。我对使用Symphy很陌生,对python也不是很有经验。非常感谢!这正是我想做的。除了使用exec,还有其他选择吗?只需了解选项是什么以及它在做什么?如果通过exec运行的所有内容都是安全的,那么就没有什么可担心的了。我认为在执行此操作之前,在“list_to_generate_expressions”中创建已存在对象的名称字符串,我会把它们称为象征?是的。如果你有一个字符串列表,你需要是symphy符号,你可以这样做:
for i in my_list:exec({i}=Symbol({i}”).format(i=i))
而不是
exec
,初始化dict
z={}
应该允许在最后的循环中使用类似于
z[name]=symphy.Eq(name,expr)
的东西。