我试图在“sympy”中定义很多变量以进行符号处理。
import sympy as sp
b_0 = sp.symbols('b_0')
b_1 = sp.symbols('b_1')
...
b_X = sp.symbols('b_X')
依此类推,
X
从 1 到 1000。
有简单的方法吗?
有几个选项:
>>> sp.symbols('b_0:10')
(b_0, b_1, b_2, b_3, b_4, b_5, b_6, b_7, b_8, b_9)
或者,使用格式化字符串,
>>> n = 10
>>> sp.symbols('b_0:{}'.format(n))
(b_0, b_1, b_2, b_3, b_4, b_5, b_6, b_7, b_8, b_9)
symbols
文档。
还有一个函数可以生成 NumPy 符号数组:
>>> sp.symarray('b', 10)
array([b_0, b_1, b_2, b_3, b_4, b_5, b_6, b_7, b_8, b_9], dtype=object)
所有这些例子都是为了分配给某些东西。例如,
b = sp.symbols('b_0:10')
将符号元组分配给 b,因此可以通过 b[0], b[1]
等方式访问它们。SymPy 符号不能通过表示它们的字符串访问,例如 "b_0" or "b_1"
。
最后,还有索引对象,以防您需要未确定大小的符号数组:当您使用
A[n]
表示法时,会动态创建索引对象,其中 A
是 IndexedBase。
如果您仍然希望能够调用单个符号,例如
b_0
:
自:
from sympy import symbols
# Number of symbols you need
X = 5
b = symbols(f"b_0:{X}")
>>> b
(b_0, b_1, b_2, b_3, b_4)
>>> b_0
NameError: name 'b_0' is not defined
您可以通过字典将它们添加到局部变量中:
from sympy import symbols
# Number of symbols you need
X = 5
# To still have b[i]
b = symbols(f"b_0:{X}")
b_dict = {f"b_{i}": b[i] for i in range(X)}
locals().update(b_dict)
要创建许多变量并将它们分配给符号,您只需使用列表即可:
from sympy import symbols, init_printing
x = symbols('x_0:10')
x
# Out:
# (x_0, x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9)
init_printing()
x
# Out:
(x₀, x₁, x₂, x₃, x₄, x₅, x₆, x₇, x₈, x₉)
但是当然要获得符号
x_0
,您需要使用x[0]
x_0
# Out:
# NameError: name 'x_0' is not defined
x[0]
# Out:
# x₀
这是生成多个编号符号的推荐方法,同时避免使用
vars()
、locals()
或 globals()
。
对于交互式工作,人们可能仍然希望拥有
x_0
、x_1
...变量,因为它们看起来更“自然”并且不需要括号,这里有一个技巧:手动复制并粘贴符号列表,然后使用它们作为变量名称
print(symbols('y_0:10'))
# Out:
# (y_0, y_1, y_2, y_3, y_4, y_5, y_6, y_7, y_8, y_9)
# |______________________________________________|
# copy
y_0, y_1, y_2, y_3, y_4, y_5, y_6, y_7, y_8, y_9 = symbols('y_0:10')
type(y_0)
# Out:
# sympy.core.symbol.Symbol