【问题标题】:Sympy get Symbol nameSympy 获取符号名称
【发布时间】:2020-01-22 06:21:03
【问题描述】:

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

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}

...(在这种情况下是否有定义符号的等价物)?

【问题讨论】:

  • 您重新定义了变量kdef。它不再是Symbol。现在是 tan 表达式。 sympy 在 python 中运行,= 是 python 运算符,而不是 sympy。
  • @hpaulj - 所以你的意思是kdef 失去了与字符串'k_{def}' 的所有关联,就好像它从未声明过一样?
  • 正确。在python中,您不声明变量。您为变量赋值,随后的赋值会覆盖之前的赋值。变量只是引用对象的方式。第二次赋值后kdef 指的是sympy.tan 对象。
  • @hpaulj - 太棒了!多亏了你们的 cmets,我做了一些修改,学到了一些重要的东西。

标签: symbols sympy


【解决方案1】:

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

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

【讨论】:

  • 附注我们如何知道莫妮卡(您的帐户图标)是否已恢复?
【解决方案2】:

基于hpaulj的cmets和别有用心的实验和学习的答案...

分配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() 查询。

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 2021-05-10
    • 1970-01-01
    • 2018-06-19
    • 2011-08-08
    • 2021-07-07
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多