9

मैं जेनेरिक डेटा के कुछ pyplotting कर रहा हूं और इसे बिजली मान से डीबी मान में परिवर्तित कर रहा हूं। सिस्टम के कारण ये मान आते हैं, 0 को 'उपयोगी डेटा यहां समाप्त होता है' संकेतक (गणित की प्रकृति, परिभाषित मूल्य नहीं) के रूप में उपयोग किया जाता है।पायथन; अपवाद जागरूक मानचित्र()

अलावा इन के साथ काम कर एक कोशिश में रूपांतरण लपेटकर है/और एक डिफ़ॉल्ट लौटने 'निम्न' मूल्य का मेरा हमेशा की तरह, जैसे

def f(value): 
    try: 
     return convert(value) 
    except ValueError: 
     return -140 #implementation specific, don't worry 

यह ठीक है और मेरे ढांचे के भीतर उपयोग के 90% के लिए dandy है , जब ग्राफिंग की बात आती है तो छोड़कर।

मैं आलसी हूँ तो क्या मैं क्षण में करना है:

pl.plot(xvals,map(f,yvals)) 

यह सही ढंग से डेटा खींचता है, और जब डेटा समाप्त होता है, एक चट्टान है, जो अपेक्षित व्यवहार है बंद plunges। लेकिन मैं क्या करना चाहता हूं ग्राफ के लिए अंत पर जब यह ValueError अपवाद को पूरा करता है और f() पूरी तरह से दूर करता है।

मानचित्र को एक लूप में तोड़ने के अलावा, किसी को भी कोई शानदार विचार मिला?

अद्यतन:

मैं Pylab/matplotlib उपयोग कर रहा हूँ "Endpoint" निष्पादन निर्भर है; कभी-कभी उपरोक्त कोई फर्क नहीं पड़ता क्योंकि कोई 'बुरा' मान नहीं है। यह सब मेरे लिए आलसी होने के प्रयास में है और ydata के मिनट (जो मैं एटीएम नहीं करता हूं, सिर्फ ylim (-140) के आधार पर डायनामिक यलिम के रीसेट करने के बजाय मैटलप्लिब्स ग्राफ स्केलिंग का उपयोग करता हूं।)

उत्तर पर बेहद महत्वपूर्ण अपडेट: unutbu का जवाब वह है जो मैं वास्तव में अपने कार्यान्वयन के लिए उपयोग कर रहा हूं, (प्रश्न निर्भरताओं में उल्लिखित नहीं) के कारण, इस नियमित रूप से उपयोग किए गए फ़ंक्शन में स्टॉपइटरेशन को अपरिवर्तित-टू- प्रश्न-नियंत्रण नियंत्रण तर्क, उन सभी अन्य उदाहरणों को प्रयास-बहिष्कारों में डाले बिना; कभी-कभी आपको लगता है कि इससे ज्यादा समझ में आता है।

सभी के लिए बहुत तेज़ होने के लिए धन्यवाद, और मैं प्रश्नावली के लिए unutbu से माफ़ी मांगता हूं।

+0

सवाल थोड़ा अस्पष्ट है। क्या आप दिखा सकते हैं कि यह कैसा दिखता है यदि आपने मानचित्र को लूप में तोड़ दिया है? – Claudiu

उत्तर

10

शायद वहाँ की साजिश रचने पुस्तकालय में कुछ चाल है, लेकिन एक बहुत अच्छा विकल्प इस तरह के डेटा के साथ शुरू नहीं पैदा कर लगता है। ऐसा नहीं है कि map आप कोड के तीस लाइनों ...

उपयोग itertools.takewhile(lambda y: y != NO_VALUE, (f(y) for y in yvals)) बचाता नहीं है (और list के लिए एक कॉल में लपेट अगर साजिश रचने पुस्तकालय एक iterable के बजाय एक सूची की आवश्यकता है)।

संपादित करें: मैं एक और भी बेहतर विचार था: आवरण में,

except ValueError: 
    raise StopIteration 

अपवाद "iterale के अंत" संकेत है कि, और map यह सम्मान जोड़ें।

+0

पुराने समाधान पर एक नोट, imap() मानचित्र() का एक इटरेटर संस्करण है, ताकि कोई भी डेटा को बिना किसी डेटा के चलाने के लिए उपयोग कर सके। हालांकि हाल ही में पाइथन संस्करण की आवश्यकता है। –

+0

@ गुस्ताव लार्सन: 'नक्शा' समझने की सूची है क्योंकि 'इंपैप' जनरेटर अभिव्यक्तियों के लिए है। और जब भी मैं कर सकता हूं, मैं जेनरेटर अभिव्यक्तियों का उपयोग कर रहा हूं। – delnan

0

ऐसा लगता है कि आपके पास डेटा है, और आप अंतिम बिंदु को प्लॉट नहीं करना चाहते हैं। तो इसे साजिश नहीं करने के बारे में क्या?

pl.plot(xvals[:-1], map(f, yvals)[:-1]) 
+0

यह सिर्फ अंतिम आइटम काट देगा। क्या ओपी ने कहा कि यह हमेशा बोगस डेटा युक्त अंतिम आइटम है? – delnan

+0

@ डेलनान: यही वह है जो मैंने समझा: "यह डेटा को सही तरीके से खींचता है, और जब डेटा समाप्त होता है, तो चट्टान से गिर जाता है"। यदि यह हमेशा अंतिम वस्तु नहीं है तो आपकी विधि उचित होगी – Claudiu

2

यदि आप matplotlib का उपयोग कर रहे हैं, तो इसका तात्पर्य है कि आपके पास numpy स्थापित है।

चूंकि आप dB पर कनवर्ट कर रहे हैं, ऐसा लगता है कि आप लॉग ले रहे हैं। उस स्थिति में, np.log(0) = -inf

आप numpy फ़ंक्शन np.ma.masked_invalid के साथ नैन और infs मुखौटा कर सकते हैं, और matplotlib मास्क किए गए सरणी प्लॉट कर सकते हैं। उदाहरण के लिए,

import matplotlib.pyplot as plt 
import numpy as np 

xvals=np.arange(100) 
yvals=np.cumsum(np.random.random(100)) 
yvals[-10:]=0 
yvals=np.log(yvals) 

print(yvals[-10:]) 
# [-Inf -Inf -Inf -Inf -Inf -Inf -Inf -Inf -Inf -Inf] 

yvals=np.ma.masked_invalid(yvals) 
plt.plot(xvals,yvals) 
plt.show() 

पैदावार enter image description here

सूचना है कि ग्राफ, xval 89 के बराबर के साथ समाप्त होता के बाद से yval के अंतिम 10 मूल्यों छुपाया जाता है।

+0

इस मामले में इसका लॉग 10 लेकिन मुझे यह पसंद है कि यह कहां जा रहा है। जांच और अद्यतन करेगा (जब तक आप या कोई और मुझे यह धड़कता नहीं है!) – Bolster

+0

मैं वास्तव में आप का जवाब दे रहा हूं लेकिन सख्ती से बोल रहा हूं, मेरे छेड़छाड़ की अन्य निर्भरता प्रश्नों को स्टॉपइटरेशन प्रतिक्रिया के साथ उत्तर दिया गया था। – Bolster

+0

कोई चिंता नहीं; खुशी है कि आपको अपना जवाब मिला। – unutbu

1

आप लूपिंग निर्माण का उपयोग करने से इंकार कर अपने आप को सीमित कर रहे हैं।

अपनी स्थिति में आप डेटा पर बार-बार दोहराना को रोकने के लिए जब एक निश्चित मूल्य तक पहुँच जाता है चाहता हूँ, कि वास्तव में forloops के उद्देश्य और breaks

yvals_ = [] 
for y in yvals: 
    y_ = f(y) 
    if y_ == -140: 
     break 
    else: 
     yvals_.append(y_) 

p1.plot(xvals[:len(yvals_)],yvals_) 
संबंधित मुद्दे