【问题标题】:Can't convert expression to float无法将表达式转换为浮点数
【发布时间】:2017-05-30 13:38:47
【问题描述】:

我正在尝试学习 python 中符号操作的来龙去脉(我是初学者)。

我有以下基本代码,输出给我一个错误,告诉我它“无法将表达式转换为浮点数”。

这段代码有什么问题:

from sympy import *
from math import *

def h(x):
    return log(0.75392 * x)

x = symbols('x')
hprime = h(x).diff(x)

print(hprime)

【问题讨论】:

  • 删除from math import *
  • @user46944 我相信问题是因为math 被包含在sympy 之后。只需交换前两行就可以了。阅读this 了解更多信息。

标签: python sympy symbolic-math derivative


【解决方案1】:

这是PEP-8 中关于通配符导入的经典示例:

应避免使用通配符导入 (from <module> import *),因为它们会使命名空间中存在哪些名称变得不清楚,从而使读者和许多自动化工具感到困惑。

问题是您需要使用 sympy.log 类,但使用 math.log 函数代替它适用于 float 对象,而不是 Symbol 对象。

当你写作时

from sympy import *

您将在您的模块命名空间中导入 sympy 包在顶层提供的所有内容(并且有很多东西,其中大部分您根本不需要),包括 sympy.log 类。

在下一条语句之后

from math import *

您正在导入 math 模块中的所有内容,包括 math.log,它会覆盖之前导入的 sympy.log 类。

考虑到这一点,您的示例可能会这样写

import sympy


def h(x):
    return sympy.log(0.485022 * x)


x = sympy.symbols('x')
h_x = h(x)
hprime = h_x.diff(x)

print(hprime)

给我们

1.0/x

P. S.:我已经删除了math import,因为它没有在给定的示例中使用。

【讨论】:

  • 是的,确实如此。这就像重新定义一个函数。最后一个定义会保留。
  • 我希望这很容易,但事实并非如此。我没有查看这些包,但想象一下 math 定义了一个函数 lnsympy 没有。然后你做import math as *import sympy as *。现在如果你调用log,那么python 将使用sympy.log,因为它是最后一次调用的。但是如果你调用ln,那么它将使用math.ln,因为没有sympy.ln。你看,以 * 形式导入会很快让人感到困惑。
  • @user46944: Python 导入系统一开始是一件很难的事情,但是你会习惯它然后理解它的厉害,我猜
  • @user46944: docs 是一个很好的起点
【解决方案2】:

这里的问题是sympymath 包都定义了一个名为log 的函数。

将它们导入为from sympy import *,然后from math import *sympy.log 替换为math.log

最好总是使用import sympy,然后调用你的函数sympy.log,或者(如果像我一样懒惰)调用import sympy as sym,然后调用sym.log。一定要使用数学包这样做。这种方法会为你以后省去很多麻烦,让你的代码更容易被别人理解。

【讨论】:

  • 是的,你可以。你实际上可以做import sympy as npimport numpy as sym。它是有效的 python 代码,python 解释器不会抱怨,但它肯定会让任何阅读你的代码的人(包括你自己)感到困惑。所以你可以,但我的建议是不要!
猜你喜欢
  • 2020-12-26
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多