Python;Исключение знают карту ()
-
14-11-2019 - |
Вопрос
Я делаю несколько 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
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])