detect if variable is of sympy type

浪子不回头ぞ 提交于 2020-06-15 04:30:21

问题


I have a variable which may or may not be a sympy class. I want to convert it to a float but I’m having trouble doing this in a general manner:

$ python
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2
>>> import sympy
>>> x = sympy.sqrt(2)
>>> type(x)
<class 'sympy.core.power.Pow'>
>>> y = 1 + x
>>> type(y)
<class 'sympy.core.add.Add'>
>>> z = 3 * x
>>> type(z)
<class 'sympy.core.mul.Mul'>
>>> if isinstance(z, sympy.core):
...     z = z.evalf(50) # 50 dp
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

I will be testing x, y, z to convert into a float. note that I can't just run evalf() on x, y and z without checking because they might be integers or floats already and this would raise an exception.


sympy.sympify() unfortunately does not convert to float. if it did then that would be the ideal solution to my problem:

>>> sympy.sympify(z)
3*sqrt(2)
>>> type(sympy.sympify(z))
<class 'sympy.core.mul.Mul'>

回答1:


All sympy objects inherit from sympy.Basic. To evaluate an sympy expression numerically, just use .n()

In [1]: import sympy

In [2]: x = sympy.sqrt(2)

In [3]: x
Out[3]: sqrt(2)

In [4]: x.n()
Out[4]: 1.41421356237310

In [5]: if (isinstance(x, sympy.Basic)):
   ...:     print(x.n())
   ...:     
1.41421356237310



回答2:


heh, at the end of the day, it turns out you can just convert a sympy object to float using python's native float conversion function! don't know why i didn't try this straight away...

>>> import sympy
>>> x = sympy.sqrt(2)
>>> float(x)
1.4142135623730951

i will use this since it works even if x is a python int or already a python float



来源:https://stackoverflow.com/questions/30023064/detect-if-variable-is-of-sympy-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!