Sympy获取符号名称

时间:2020-01-22 06:21:03

标签: symbols sympy

我可以得到一个“未定义”符号的名称:

import sympy as sym
knodef = sym.Symbol('k_{nodef}')
print(type(knodef))
sym.pprint(knodef.name)

<class 'sympy.core.symbol.Symbol'>
k_{nodef}

但是,一旦我将其定义为表达式,就无法再获得名称了。

kdef = sym.Symbol('k_{def}')
kdef = sym.tan(b*x)
print(type(kdef))
sym.pprint(kdef.name)                        # AttributeError: 'tan' object has no attribute 'name'

tan
<Error raised>

如何获取kdef的名称?

类似的功能...

knodef2 = sym.Function('k_{nodef2}')
#display(disp.Math(knodef2.name), type(knodef2))
print(type(knodef2))
sym.pprint(knodef2.name)

<class 'sympy.core.function.UndefinedFunction'>
k_{nodef2}

...(在这种情况下是否等同于定义符号)?

2 个答案:

答案 0 :(得分:4)

正如您所演示的,Symbol and Function的name属性可用于返回“名称”的字符串形式。对于UndefinedFunction,您可以使用.func.name来获取该字符串,但是对于已定义的FunctionClass,您可以仅在str属性上使用func

>>> s=Symbol('s');f=Function('f');a=f(s);b=tan(s)
>>> s.name
's'
>>> f.name
'f'
>>> a.func.name
'f'
>>> str(b.func)
'tan'

答案 1 :(得分:1)

根据hpaulj的评论以及别有用心的实验和学习进行解答...

分配kdef = sym.Symbol('k_{def}')分配名称'k_{def}',因为这是类sym.Symbol的属性。

以后分配kdef = sym.tan(b*x)只是定义了一个类sym.tan的新对象,并使用kdef作为其变量,但实际上与先前的对象无关。因此,在这一点上,kdef'k_{def}'之间不再有关联。

这很容易发现:

kdef = sym.Symbol('k_{def}')
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')
kdef = sym.tan(b*x)
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')

kdef = k_{def}, address = 0x20f21b58228
kdef = tan(b*x), address = 0x20f21b584f8

甚至在分配相同类型的情况下也会发生这种情况,原则上可以使用相同的确切内存块:

q = 2.1
print('q = ', q, ', address = ', hex(id(q)), sep='')
q = 30000.1
print('q = ', q, ', address = ', hex(id(q)), sep='')

q = 2.1, address = 0x1c4dbd5d0d0
q = 30000.1, address = 0x1c4dbd5d2b0

此外,事实证明类sym.tan没有name,因此不可能获得它,因为它不存在。 由于给定的变量可能有或没有name,因此可以简单地try / expect,或用dir()进行查询。