Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SymPy:很难简化包含因子1的表达式_Python_Sympy_Simplify - Fatal编程技术网

Python SymPy:很难简化包含因子1的表达式

Python SymPy:很难简化包含因子1的表达式,python,sympy,simplify,Python,Sympy,Simplify,很抱歉这个新手的问题,但到目前为止我还没有在其他地方找到答案 假设我们有一个符号,我们将它乘以浮点数1: import sympy x = sympy.Symbol('x') x = 1.0 * x 包含此x的所有表达式也将包含因子1,无论我做什么: from pprint import pprint pprint(x) pprint(sympy.simplify(x)) 输出: 1.0⋅x 1.0⋅x 在上面的示例中,我希望输出x,而不是1.0⋅x。是否可以简化表达式,使其以浮点数1求

很抱歉这个新手的问题,但到目前为止我还没有在其他地方找到答案

假设我们有一个符号,我们将它乘以浮点数1:

import sympy

x = sympy.Symbol('x')
x = 1.0 * x
包含此
x
的所有表达式也将包含因子1,无论我做什么:

from pprint import pprint
pprint(x)
pprint(sympy.simplify(x))
输出:

1.0⋅x
1.0⋅x

在上面的示例中,我希望输出
x
,而不是
1.0⋅x
。是否可以简化表达式,使其以浮点数1求解所有乘法?我应该将这个浮点数转换成另一个数据类型吗?

看起来这是由于浮点数与整数1的关系造成的-如果你可以不使用1,也许不要使用1.0

如果f.as_integer_ratio()==(1,1),您可以检查它是否与
相同为1.0,如果是,请不要在不必要的“1.0”前面加上前缀:

>>> xf = 1.0 * x
>>> xi = 1 * x

>>> xf
1.0*x
>>> xi
x

>>> pprint(xf)
1.0*x
>>> pprint(xi)
x
这可能是由于浮点不精确(我对sympy了解不多,不能多说)

编辑:
float.as\u integer\u ratio()
的运行时间很小,回答您的问题:

>>> python -m timeit -n 1000000 '(1.0).as_integer_ratio() == (1,1)'
1000000 loops, best of 5: 172 nsec per loop

>>> python -m timeit -n 1000000 '(1.1).as_integer_ratio() == (1,1)'
1000000 loops, best of 5: 327 nsec per loop

>>> python -m timeit -n 1000000 '(1.01).as_integer_ratio() == (1,1)'
1000000 loops, best of 5: 331 nsec per loop

>>> python -m timeit -n 1000000 '(0.999999999999).as_integer_ratio() == (1,1)'
1000000 loops, best of 5: 329 nsec per loop

我找到了解决办法。有一个特殊的功能可以完成这项工作。

谢谢。我不能将它转换为int,因为有时它是一个不等于1的浮点数。但当它是,我想简化。也许方法是使用if语句检查它是否等于1。在我看来,后者有点脏。你可以检查它是否与f.as_integer_ratio()==(1,1)
相同,它是一个耗时的函数吗?你感觉如何?什么,将
float.as\u integer\u ratio()
与例如
sympy.simplify.simplify.nsimpplify(…,公差)
?我完全怀疑他们的运行时间问题。如果你愿意,你可以调整公差。@freude:我用timeit测量了运行时间,确认它很小。