Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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 索引数据库的替代方案_Python_Sympy - Fatal编程技术网

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}字典或一个新旧元组列表。