我有一个恼人的错误消息,我无法弄清楚。 以下代码(在Python 3中)给出了正确的结果:
from sympy import *
x, y, z, t = symbols('x y z t')
expr = cos(x) + 1
print(expr.subs(x, y))
结果是:
cos(y) + 1
然而,当expr被修改或者说不同时,
from sympy import *
x, y, z, t = symbols('x y z t')
expr = 1
print(expr.subs(x, y))
输出是错误消息,
AttributeError: 'int' object has no attribute 'subs'
我该如何解决这个问题?我需要sub来处理符号表达式和必要时的数字(比如说符号表达式被修改为结果是数字的)。 问候。
答案 0 :(得分:2)
第二个示例中的1
不是SymPy编号,只是常规Python整数。
您可以使用S()
(或sympify()
)功能将其变为SymPy编号。
官方文档有一个description来描述您的问题,并提供了一些示例,以及sympify
可以执行的@ConditionalOnProperty。
答案 1 :(得分:1)
1
不是Sympy表达式。 1
只是一个常规的Python int。如果要对其执行替换,则需要将其包装在Sympy Integer中。 (另外,请停止使用import *
。):
import sympy
expr = sympy.Integer(1)
请注意,Sympy整数显示与常规整数相同,因此如果某些1
似乎有subs
方法而其他人没有,那么1
可能不是全部相同的类型。您可以查看type
:
In [14]: x = 1
In [15]: y = sympy.Integer(1)
In [16]: x
Out[16]: 1
In [17]: y
Out[17]: 1
In [18]: type(x)
Out[18]: int
In [19]: type(y)
Out[19]: sympy.core.numbers.One
答案 2 :(得分:0)
与其他答案一样,1
不是SymPy整数,它是一个Python整数。因此它没有SymPy的方法。
您可以将expr
声明为以下其中一项,以使其有效:
expr = S.One
expr = S(1)
expr = Integer(1)
SymPy整数是类Integer
的实例,而Python整数是int
个对象。
还有一个额外的技巧可以避免这一步骤:执行isympy -i
。 -i
参数添加了一个额外的输入图层,用Integer(digits)
个对象替换所有数字,例如:
In [1]: 1
Out[1]: 1
In [2]: In[1]
Out[2]: u'Integer (1 )'
即,使用 IPython 检查输入1是什么,给出u'Integer (1 )'
。