如何摆脱sympy替换错误信息?

时间:2016-06-28 18:43:50

标签: python sympy

我有一个恼人的错误消息,我无法弄清楚。 以下代码(在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来处理符号表达式和必要时的数字(比如说符号表达式被修改为结果是数字的)。 问候。

3 个答案:

答案 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 )'