Вопрос

Я делаю несколько Pyplottity of общих данных и преобразовав его из значения мощности в значение БД. Благодаря системе эти значения приходят, 0 используется в качестве «полезных данных заканчивается здесь» индикатор (характер математики, не определенного значения).

Мой обычный способ борьбы с этим обещает преобразование в попытках / кроме и возвращает значение «низкое» по умолчанию, например,

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

Это хорошо, и DANDY для 90% использования в моем каркасе, за исключением случаев, когда речь идет о графике.

Я ленивый, так что я делаю в минуту:

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

Это правильно рисует данные, и когда данные заканчиваются, погружается с утеса, что является ожидаемой поведением. Но то, что я хотел бы произойти, это для графика только End , когда он соответствует исключительному исключителью ValueError и вообще выполнять с f ().

Другие, чем ломать карту в петлю, у кого-нибудь есть какие-то блестящие идеи?

Обновления:

Я использую pylab / matplotlib «Конечная точка» - зависит от выполнения; Иногда вышеизложенное не имеет значения ATALL, так как нет никаких «плохих» ценностей. Это все усилия, чтобы я был ленивым и использовать масштабирование графа MATPLOTLIBS вместо сброса динамического юриста на основе min ydata (которые я не делаю банкомат, просто YLIL (-140) в этом случае.) .

Смущенное Важное обновление в ответ: Ответ ЮНУТБУ - это то, что я фактически использую для моей реализации, из-за (не упомянул в зависимости в вопросах), поскольку повышение затруднения в этой регулярной используемой функции наносит Havoc с не связанным с логикой управления вопросом, не вкладывая все из этих других случаев в попытках; Иногда -инф имеет больше смысла, чем вы подумаете.

Спасибо всем, чтобы быть удивительно быстрым, и я прошу прощения в ЮНУТБУ за вопрос задачи.

Это было полезно?

Решение

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