การแปลงฟังก์ชันจาก sympy เป็น numpy (ข้อผิดพลาดของแอตทริบิวต์)

import numpy as np
import sympy as sym
from numpy import sin
from sympy import symbols, diff

func = lambda x: sin(x)
x    = symbols('x')
print diff(func(x),x)

วิธีนี้ได้ผลหากฉันแทนที่ฟังก์ชันด้วยพหุนาม หรือหากฉันวางฟังก์ชันตรีโกณมิติลงในตัวดำเนินการ diff โดยตรง แต่ในรูปแบบนี้ฉันได้รับ AttributeError: sin

โดยพื้นฐานแล้วฉันคิดว่า python ไม่สามารถจดจำ func ได้ว่าเป็นเพียงแค่ฟังก์ชันตรีโกณมิติซึ่งมันรู้วิธีบูรณาการเชิงสัญลักษณ์ ฉันแค่มีบาปนำเข้าแบบ Sympy แล้วสิ่งต่าง ๆ ก็จะได้ผล แต่แล้วฉันก็ติดอยู่กับ func ที่อ้างอิงถึงบาปในเนมสเปซ Sympy และยังมีสิ่งต่าง ๆ ในอนาคตที่ฉันต้องการทำกับ func ซึ่งต้องการให้ถูกกำหนดโดยใช้ sin ในเนมสเปซแบบ numpy .


person Thoth    schedule 16.02.2014    source แหล่งที่มา
comment
np.sinจะไม่ยอมรับ sympy.core.symbol.Symbol และฉันสงสัยว่ามีวิธีที่สมเหตุสมผลในการทำเช่นนั้น ทำไมคุณถึงพยายามทำเช่นนี้?   -  person M4rtini    schedule 17.02.2014
comment
@ M4rtini ฉันต้องการพล็อต func โดยใช้ matplotlib และหาก func ถูกกำหนดโดยใช้ sin ในเนมสเปซ sympy จะทำให้เกิดข้อผิดพลาด   -  person Thoth    schedule 17.02.2014


คำตอบ (2)


คุณควรสร้างนิพจน์ของคุณขึ้นมาในเชิงสัญลักษณ์โดยใช้ฟังก์ชัน SymPy จากนั้นใช้ lambdify เพื่อแปลงเป็นสิ่งที่สามารถประเมินได้ด้วย NumPy

person asmeurer    schedule 20.02.2014

นี่ไม่ใช่วิธีที่คุณใช้ sympy คุณไม่สามารถใช้ฟังก์ชันปกติร่วมกับ numpy ได้ คุณต้องสร้างนิพจน์เชิงสัญลักษณ์โดยใช้สิ่งที่มีให้

ในการเขียนโค้ดเพื่อหาอนุพันธ์ของ sin(x) คุณจะต้องทำ

import sympy as sym
from sympy import sin, symbols, diff

x = symbols('x')
print diff(sin(x), x)

หากคุณมีกรณีอื่นๆ ที่กำลังประสบปัญหา คุณจะต้องแสดงกรณีนั้น คุณไม่สามารถผสม sympy กับสิ่งที่ไม่ใช่ sympy ด้วยวิธีนี้ได้ ดังนั้นจึงไม่มีข้อเสนอแนะทั่วไปบางประการที่สามารถให้ได้

person Mike Graham    schedule 16.02.2014
comment
ดังนั้นเมื่อฉัน lambdify อนุพันธ์ของฟังก์ชัน sympy แล้ว ไม่มีทางที่จะเอามันออกจากเนมสเปซ sympy ได้เลยใช่ไหม - person Thoth; 17.02.2014
comment
@ user1378571 คุณควรย้อนกลับไปสองสามก้าวแล้วถามเกี่ยวกับสิ่งเริ่มแรกที่คุณพยายามทำ ไม่ใช่สิ่งที่คุณได้ทำไปแล้วเพื่อให้บรรลุผลสำเร็จ คุณกำลังแนะนำสิ่งที่ไม่เป็นไปตามที่คุณต้องการ perlmonks.org/index.pl?node_id=542341 - person Mike Graham; 17.02.2014