如何在SymPy中定义很多符号

问题描述 投票:0回答:3

我试图在“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。

有简单的方法吗?

sympy repeat symbols
3个回答
11
投票

有几个选项:

>>> 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。


2
投票

如果您仍然希望能够调用单个符号,例如

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)

0
投票

要创建许多变量并将它们分配给符号,您只需使用列表即可:

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
© www.soinside.com 2019 - 2024. All rights reserved.