2013-04-10 4 views
5

अब how to parse a string for magnitude and physical unit का प्रश्न सुलझाया गया है, अगला सवाल यह है कि, इन दोनों को एक साथ पैक करने के बारे में सबसे अच्छा कैसे होना चाहिए, एक तरफ बहुत अधिक प्रदर्शन नहीं होता है लेकिन दूसरी तरफ एक इकाई सत्यापन जोड़ता है ।परिमाण और भौतिक इकाइयों को पाइपोनिक रूप से कैसे जोड़ना है?

मेरा मतलब स्पष्ट करने के लिए, उदाहरण के रूप में दो वेग v = 5 m/s और u = 10 mph उदाहरण लें। previous question पहले से ही SI units पर सबकुछ परिवर्तित करने का ख्याल रखता है (इसलिए के कारण आप crash another Mars mission नहीं करेंगे)। तो आंतरिक रूप से एक होगा उदाहरण के लिए एक tuple v = (5, m/s) और u = (4.4704, m/s) और आउटपुट रूटीन आउटपुट के लिए पसंदीदा इकाइयों का उपयोग करने का ख्याल रखेगा। दोनों पर यूनिट-संगत संचालन लागू करते समय, उदा। इसके वर्ग, या उनके वर्गों को घटाना, वैध हैं, v - 1/u जैसे अन्य पूर्ण और पूर्ण बकवास हैं। लेकिन यह सर्वोत्तम कैसे लागू किया जाना चाहिए? कुछ संभावनाएं जिन्हें मैंने अब तक माना है:

  • मत करो। चूंकि आंतरिक रूप से केवल एसआई इकाइयों का उपयोग किया जाता है, इसलिए स्पष्ट हो सकता है कि कौन सी इकाइयां लागू होती हैं। लेकिन सूत्रों की उपेक्षा यह है कि सूत्र अधिक जटिल हो जाते हैं यदि सूत्र अधिक जटिल हो जाते हैं
  • सबक्लास tuple और यूनिट स्थिरता जांच तैयार करने वाले सभी वैध संचालन को ओवरराइड करें। मजेदार लगता है ...
  • , v = 5*unit.m/unit.s के आयाम समय (अर्थपूर्ण कार्य) के sympy.core.mul.Mul एस के रूप में मानों को स्टोर करें। मुझे इसके शानदार प्रदर्शन की उम्मीद नहीं है, साथ ही मुझे यह भी जांचना होगा कि ऑपरेशन का परिणाम अभी भी magnitude * unit के रूप में है या नहीं।
  • numpy.array का उपयोग अतिरिक्त sympy.physics.unit.Unit प्रविष्टि के साथ करें, जो पहले से ही तत्व के संचालन को लागू करता है। यह अभी भी बाद में (तथ्य यह है कि जैसे m+m=2m भी इलाज किया जा करने की आवश्यकता होगी ...)
  • उपवर्ग tuple के बजाय numpy.array एक मैनुअल इकाई संगतता जांच की आवश्यकता होगी, कॉल करने से पहले ऑपरेटरों इकाई संगतता जांच prepending ओवरराइड super - सरणी पर ऑपरेटर इकाई के बिना। हो सकता है कि कुछ __getattribute__ जादू इस आसान बनाने में कर सकता है के बाद से सभी वैध संचालन पहले से ही दोनों परिमाण और इकाई के लिए लागू किया जाता है ...

इन समाधानों अच्छा/pythonic में से एक है? या फिर दूसरा तरीका क्या है? क्या एक लाइब्रेरी जो इसका इलाज करती है वह पहले से मौजूद है?

संपादित करें ध्यान दें कि यह स्केलर मानों तक सीमित नहीं होना चाहिए; वैक्टर, मैट्रिक्स (शायद भी sympy.Symbol रों) भी

उत्तर

1

उपयोग काम करना चाहिए Magnitude पुस्तकालय:

from magnitude import mg 

m = mg(5, 'kg') 
a = mg(9.82, 'm/s2') 
f = m * a 
print f, f == mg(49.1, 'N') 

u = mg(70, 'km/h') 
g = mg(9.82, 'm/s2') 
s = (u**2)/(2*g) 
print s, s > mg(10, 'm') 

दिलचस्प बात यह तब होता है जब वहाँ एक इकाई बेमेल है:

>>> m = mg(5, 'kg') 
>>> a = mg(9.82, 'm/s') 
>>> f = m * a 
>>> print f, f == mg(49.1, 'N') 
MagnitudeError: Incompatible units in comparison: [1, -2, 0, 1, 0, 0, 0, 0, 0] and [1, -1, 0, 1, 0, 0, 0, 0, 0] 

सर्वश्रेष्ठ नहीं है त्रुटि शायद संदेश, लेकिन यह आपको गलत तरीके से मूल्यों को संभालने से प्रभावी ढंग से रोकता है।

+0

अच्छा लगता है (त्रुटि संदेश मुझे लगता है कि एसआई इकाई शक्तियों के बारे में है)। क्या यह सरणी का इलाज भी कर सकता है? –

+0

क्या आपके पास सूचियां हैं?'श्रेणी में टी के लिए [मिलीग्राम (टी, 'एस') * मिलीग्राम (70, 'किमी/एच') (0)] –

+0

मैं वैक्टर और मैट्रिस के बारे में सोच रहा था, उदा। 3 डी वेग वैक्टर, और 'मिलीग्राम ([। 5,0,3],' एम/एस ') जैसे कुछ' शायद '[मिलीग्राम (.5,' एम/एस '), एमजी (0,' से बेहतर दिखेंगे। एम/एस '), एमजी (3,' एम/एस ')] ' –

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