【问题标题】:sympy AttributeError: 'Pow' object has no attribute 'sin'sympy AttributeError:“Pow”对象没有属性“sin”
【发布时间】:2017-04-09 14:32:07
【问题描述】:

我读过this SO post,它说命名空间冲突是导致此错误的原因之一。我经常陷入这个错误。所以,我想了解这里到底发生了什么?图书馆的期望是什么?

编辑:fun = lambda x: 4*x*(np.sin(x**2) - 3)*np.cos(x**2) 来自一个测试用例,所以实际上我必须将它用作“有趣”功能。很抱歉错过了这些信息。请讨论尊重此约束。

EDIT2:这是一个错误重现代码,而不是完整的脚本。 任务是计算输入函数的微分,该函数可以通过使用扰动 Δ=10 -8 的前向差分近似来评估 numpy 数组。

代码:

import sympy
import numpy as np 

# TESTING...
x = sympy.Symbol('x')
fun = lambda x:  4*x*(np.sin(x**2) - 3)*np.cos(x**2)  
print fun
h = 10e-8  #perturbation
print fun(x)
print fun(x+h)
df = (fun(x+h) - fun(x)) / h
print "diff is:", df

错误:

<function <lambda> at 0x000000001068E2E8>
Traceback (most recent call last):

  File "<ipython-input-75-0582d8ebb11b>", line 1, in <module>
    runfile('D:/test_hw3.py', wdir='D:')

  File "D:\anaconda\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

  File "D:\anaconda\lib\site-packages\spyder\utils\site\sitecustomize.py", line 87, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "D:/test_hw3.py", line 23, in <module>
    print fun(x)

  File "D:/test_hw3.py", line 20, in <lambda>
    fun = lambda x:  4*x*(np.sin(x**2) - 3)*np.cos(x**2)
AttributeError: 'Pow' object has no attribute 'sin'

【问题讨论】:

    标签: python numpy sympy


    【解决方案1】:

    您应该使用sympy.sin/cos 而不是np.sin/cos。 Numpy 不知道如何使用 sympy 表达式。

    fun = lambda x: 4 * x * (sympy.sin(x**2) - 3) * sumpy.cos(x**2)  
    

    另一方面,如果您必须保留np.sin,那么您应该fun 发送一个sympy 变量。相反,df 本身应该成为一个函数。

    fun = lambda x:  4*x*(np.sin(x**2) - 3)*np.cos(x**2)  
    h = 1e-8
    
    df = lambda x: (fun(x+h) - fun(x)) / h
    
    # usage:
    df( np.array([1.0, 2.0, 3.0, 4.0]) )
    

    顺便说一句,sympy 已经有一个 diff 函数来计算导数。

    df = sympy.diff(fun(x), x)
    

    【讨论】:

    • 您能否对照我的编辑查看您的答案。谢谢。
    • @devutor 你真的应该使用 sympy 吗?
    • 是的,我是。你有替代品吗? [虽然我的要求不会让我为这项任务追求它们]
    • @devautor df 的期望是什么?
    • 任务是计算输入函数的微分,该函数可以通过使用扰动 ∆=10 -8 的前向差分近似来评估 numpy 数组。
    【解决方案2】:

    函数fun 使用np.sinnp.cos,它们是numpy 函数,仅接受numpy 识别的data types 作为参数。当您执行 fun(x) 时,您将作为参数提供给 numpy 函数一个 sympy 对象,而 numpy 无法识别该对象,从而引发此“神秘”错误消息。

    请注意,当您使用语句 lambda x:... 定义 fun 时,x 在定义中被视为有效数据类型的虚拟变量名称(即使您已将上面的 x 定义为 sympy 符号)。

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 2020-02-27
      • 2012-12-01
      • 2021-04-19
      • 2016-07-15
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      相关资源
      最近更新 更多