سؤال

أقوم ببعض pyplotting من البيانات العامة وتحويله من قيمة الطاقة إلى قيمة DB. نظرا لنظام هذه القيم تأتي من، يتم استخدام 0 كمؤشر "البيانات المفيدة هنا" المؤشر (طبيعة الرياضيات، وليس قيمة محددة).

طريقة التعامل المعتادة مع هذه التفاف التحويل في محاولة / ما عدا وإرجاع قيمة "منخفضة منخفضة"، على سبيل المثال giveacodicetagpre.

هذا جيد ودنتي لمدة 90٪ من الاستخدام داخل إطاري، إلا عندما يتعلق الأمر بالرسوم البيانية.

أنا كسول إذن ما أقوم به في اللحظة هو: giveacodicetagpre.

يعادل هذا البيانات بشكل صحيح، وعندما تنتهي البيانات، يغرق من جرف، وهو السلوك المتوقع. ولكن ما أود حدوثه هو أن يكون الرسم البياني فقط end عندما يستوفي استثناء valueError والتفتيك مع f () تماما.

بخلاف كسر الخريطة في حلقة، أي شخص لديه أي أفكار رائعة؟

التحديثات:

أنا أستخدم pylab / matplotlib "نقطة النهاية" تعتمد على التنفيذ؛ في بعض الأحيان، لا يهم أعلاه atall لأنه لا توجد قيم "سيئة". هذا كل شيء في محاولة لي ليكون كسول واستخدام نظام الرسم البياني Matplotlibs بدلا من إعادة ضبط YLIM الديناميكي على أساس دقيقة YDATA (التي لا أفعل أجهزة الصراف الآلي، فقط YLIM (-140) في هذه الحالة.)

تحديث مهم غامض عن الإجابة: إجابة Unutbu هي ما سأستطيع فعليا عن تطبيقي، بسبب (غير مذكور في تبعيات السؤال)، كما رفع الإيقاف في هذه الدالة المستخدمة بانتظام يسخر من المنطق السيطرة غير المرتبط بالسلام، دون وضع جميع من تلك الحالات الأخرى في محاولة - ما عدا؛ في بعض الأحيان، في بعض الأحيان يجعل أكثر منطقية مما تظن.

شكرا للجميع لأن تكون سريعا رائعا، وأعتذر عن Unutbu للتوافقة.

هل كانت مفيدة؟

المحلول

Perhaps there's some trick in the plotting library, but a much better options seems not generating such data to begin with. It's not that map saves you thirty lines of code...

Use itertools.takewhile(lambda y: y != NO_VALUE, (f(y) for y in yvals)) (and wrap it in a call to list if the plotting library requires a list instead of an iterable).

Edit: I had an even better idea: In the wrapper, add

except ValueError:
    raise StopIteration

That's the exception signaling "end of iterale", and map respects it.

نصائح أخرى

If you are using matplotlib, then it implies you have numpy installed.

Since you are converting to dB, it sounds like you might be taking a log. In that case, np.log(0) = -inf.

You can mask nans and infs with the numpy function np.ma.masked_invalid, and matplotlib can plot masked arrays. For example,

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()

yields enter image description here

Notice that the graph ends with xval equal to 89, since the last 10 values of yval are masked.

You're needlessly limiting yourself by refusing to use a looping construct.

In your situation you want to stop iterating over data when a certain value is reached, that is exactly the purpose of forloops and breaks

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

p1.plot(xvals[:len(yvals_)],yvals_)

It seems like you have data, and you don't want to plot the last point. So what about not plotting it?

pl.plot(xvals[:-1], map(f, yvals)[:-1])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top