请考虑以下事项:
import sympy
from sympy import *
x = IndexedBase('x')
i = Symbol('i', integer=True)
z = x[i] + x[i+1] + x[i+2]
print z
x[i+1] = 2 # <-- problem
print z
在“x [i + 1] = 2”时,我遇到“TypeError:'IndexedBase'对象不支持项目分配” 我希望允许更新x [i + 1]的符号值,并且让“print z”给我更新的符号值。我不足以替换z中的x [i + 1]项,因为可能有其他表达式使用相同的x [i + 1]项,我希望它们也可以更新。
而不是IndexedBase,建议使用哪些替代方法,因为IndexedBase不支持项目分配?
我使用了IndexedBase,因为我想用符号引用来表示内存。
请让我知道如何重新解释我的问题和/或需要更好地帮助您。
答案 0 :(得分:3)
SymPy表达式不可变。如果要更改它们,则需要使用subs
之类的函数来创建新表达式(如z2 = z.subs(x[i + 1], 2)
)。
答案 1 :(得分:1)
也许你需要使用的是像lambda。我们假设您要将值存储在x中。我们将从10个值开始
x = range(10)
现在定义一个表达式,用于添加x
的第一个和第二个值z = lambda: x[0] + x[1]
这个lambda会在你每次调用时执行你所说的(你在z之后使用括号来做:
>>> z()
1
如果更改x [1],则z将给出新的答案:
>>> z[1] = 42
>>> e1()
42
现在,如果你想要一个依赖于i的泛型范围,你必须创建一个变量的函数,i:
>>> e2 = lambda i: x[i] + x[i+1]
如果你为i赋予这个函数值0,你会得到x [0] + x [1];如果你为它发送值为3,你将获得x [3] + x [4]:
>>> e2(0) # x[0] + x[1] = 0 + 42
42
>>> e2(3) # x[3] + x[4] = 3 + 4
7
这是否为您提供了如何继续您想要做的事情的想法?