Python 索引数据库的替代方案
考虑以下几点:Python 索引数据库的替代方案,python,sympy,Python,Sympy,考虑以下几点: 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给我更新后的
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是因为我想用符号引用来表示内存
请让我知道如何重新表述我的问题和/或需要更好地帮助您 也许你需要使用的是类似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]
如果你给这个函数一个0的值,你会得到x[0]+x[1];如果你为i发送一个值3,你将得到x[3]+x[4]:
>>> e2(0) # x[0] + x[1] = 0 + 42
42
>>> e2(3) # x[3] + x[4] = 3 + 4
7
这是否为您提供了一些关于如何继续执行所需操作的想法?SymPy表达式是不可变的。如果要更改它们,需要使用subs之类的函数来创建一个新表达式,如z2=z.subsx[i+1],2。是的,我想这就是我想要的。我将只执行z=z.subsx[i+1],2这允许您一次替换x的一个条目。是否有某种方法可以用一个值列表来代替整个x?subs还接受一个{old:new}字典或一个新旧元组列表。