2012-05-21 21 views
28

मैं sympy के साथ प्रयोग कर रहा हूं और मैंने एक ऐसे मुद्दे पर मारा है जिसे मैं काम नहीं कर सकता।मानों की एक सरणी से सिम्पी अभिव्यक्ति का मूल्यांकन करें

scipy का उपयोग करते हुए मैं एक अभिव्यक्ति लिख सकते हैं और इस प्रकार एक्स मूल्यों की एक सरणी के लिए यह मूल्यांकन कर सकते हैं:

import sympy 
x = sympy.symbols('x') 
g = x**2 

मैं कर सकते हैं:

import scipy 
xvals = scipy.arange(-100,100,0.1) 
f = lambda x: x**2 
f(xvals) 

sympy का उपयोग करते हुए इस प्रकार मैं एक ही अभिव्यक्ति लिख सकते हैं निम्नलिखित अभिव्यक्ति करके एक ही मान के लिए इस अभिव्यक्ति का मूल्यांकन करें:

g.evalf(subs={x:10}) 

हालांकि मैं कर सकता हूं एक्स मानों की एक सरणी के लिए इसका मूल्यांकन कैसे करें, जैसे मैंने scipy के साथ किया था। यह मैं कैसे करूंगा?

उत्तर

35

पहले। इस बग रिपोर्ट http://code.google.com/p/sympy/issues/detail?id=537

दूसरा जाँच करें, आप कई मूल्यों SymPy सबसे अच्छा विकल्प नहीं है के लिए संख्यानुसार कुछ का मूल्यांकन करना चाहते हैं (यह एक प्रतीकात्मक पुस्तकालय सब के बाद है)। Numpy और scipy का प्रयोग करें।

हालांकि, कुछ का मूल्यांकन करने का वैध कारण संख्यानुसार होगा कि अभिव्यक्ति पाने का मूल्यांकन किया जाना है ताकि आप SymPy में यह निकाले जाते हैं और फिर NumPy/SciPy/सी/फोरट्रान में यह मूल्यांकन मुश्किल था। NumPy के लिए एक अभिव्यक्ति का अनुवाद करने के लिए बस अधिक जानकारी के लिए lambdify की docstring का उपयोग

from sympy.utilities.lambdify import lambdify 
func = lambdify(x, big_expression_containing_x,'numpy') # returns a numpy-ready function 
numpy_array_of_results = func(numpy_array_of_arguments) 

चेक। ध्यान रखें कि लैम्बडिफ़ में अभी भी कुछ समस्याएं हैं और उन्हें पुनः लिखने की आवश्यकता हो सकती है।

और बस एक तरफ ध्यान दें के रूप में, यदि आप वास्तव में कई बार भाव का मूल्यांकन करना चाहते हैं, तो आप fortran या सी कोड है कि लपेटा जाता है और अजगर से प्रतिदेय है बनाने के लिए क्रम में sympy से codegen/autowrap मॉड्यूल का उपयोग कर सकते हैं।

संपादित करें: तरीके SymPy में numerics करने के लिए की एक अद्यतन सूची विकि पर पाया जा सकता है https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

-3

import sympy 
x = sympy.symbols('x') 
f = lambda x: x**2 
print [f(k) for k in range(4)] 

प्रयास करें या आप भी पल SymPy है जो आप इस मामले में चाहते हैं NumPy सरणी के लिए समर्थन की गारंटी नहीं है पर, कोशिश कर सकते हैं सब के

g = x**2 
print [g.subs(x,k) for k in range(4)] 
+3

आपका पहला उदाहरण किसी भी तरह से सिम्पी का उपयोग नहीं कर रहा है। प्रतीक जिसे आप परिभाषित करते हैं वह लैम्ब्डा में नहीं पहुंचाया जाता है।मोरवर, सवाल numpy arrays के बारे में था और अनुमानतः सभी विशेष प्रति-तत्व संचालन numpy द्वारा समर्थित था। ये पाइथन की सूची में मौजूद विशेषताएं नहीं हैं (आप वास्तव में क्या उपयोग कर रहे हैं)। – Krastanov

7

जबकि the accepted answer यह स्पष्ट है कि ओपी के लिए संख्यात्मक मूल्यांकन देख रहा था, मैं अभी भी आपको बताएंगे कि बनाता है एक भी symarray का उपयोग करके प्रतीकात्मक मूल्यांकन हो सकता है:

import sympy 
xs = sympy.symarray('x', 10) 
f = lambda x: x**2 
f(xs) 

पैदावार

array([x_0**2, x_1**2, x_2**2, x_3**2, x_4**2, x_5**2, x_6**2, x_7**2, 
     x_8**2, x_9**2], dtype=object) 

ध्यान दें कि यह आंतरिक रूप से numpy सरणी का भी उपयोग करता है, लेकिन sympy.Expr संस्करणों से भरा है।

+0

लेकिन symarray प्रत्येक x_i के लिए एक संख्यात्मक मान विशेषता नहीं देता है, तो आप प्रश्न में बताए गए arange के लिए अभिव्यक्ति का मूल्यांकन कैसे करेंगे? – fccoelho

+0

@fccoelho मैं स्वीकृत उत्तर से कम से कम 'lambdify' के साथ शुरू करने के लिए numpy का उपयोग करेंगे। लेकिन अगर किसी कारण से आपके पास वास्तव में प्रतीकात्मक अभिव्यक्तियों की एक श्रृंखला है, तो आपको शायद एक सूची समझ (या 'लूप के लिए) का उपयोग करना होगा। शायद एक आसान तरीका है, लेकिन मैंने कभी भी 'सिमार्रे' के साथ परेशान नहीं किया। मेरा जवाब वास्तव में केवल एक sidenote के रूप में है –

संबंधित मुद्दे