9

일반 데이터의 일부 플롯팅을 수행하고이를 전력 값에서 dB 값으로 변환합니다. 시스템으로 인해이 값은 0이 '유용한 데이터가 여기에 표시됩니다'표시기 (수학의 본질, 정의 된 값이 아님)로 사용됩니다.Python; 예외 인식지도()

예를 들어, '낮은'값을 제외/시도의 변환을 포장 이들 다루는 기본을 반환 내 일반적인 방법으로,

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

이 잘 내 프레임 워크 내에서 사용의 90 %를 멋쟁이 그래프 작성을 제외하고

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

이 올바르게 데이터를 그립니다, 데이터가 종료 될 때, 예상되는 동작입니다 절벽에서 떨어져 틈 :

나는 게으른 그래서 내가이 순간에 할 것은. 그러나 내가 원하는 것은 그래프가 단지 일 때 ValueError 예외를 충족시키고 f()를 사용하지 않을 때입니다.

맵을 루프로 분해하는 것 외에는 누구도 훌륭한 아이디어가 있습니까?

UPDATES : 나는 Pylab /하기 matplotlib 을 사용하고

"엔드 포인트"에 의존 실행이다; 때로는 '나쁜'가치가 없기 때문에 위의 사항은 전혀 중요하지 않습니다. 이것은 내가 게으름을 피우고, ydata의 min을 기반으로 dynamic ylim을 재설정하는 대신 matplotlibs 그래프 스케일링을 사용하기위한 것입니다 (이 경우에는 atm은하지 않으며,이 경우에는 ylim (-140)입니다)

희미하게 중요 업데이트 답변 : unutbu의 대답은이 구현에서 사용하게 될 것입니다. (질문 종속성에 언급되지 않았기 때문에)이 정기적으로 사용되는 함수에서 StopIteration을 발생 시키면 무관계 - 다른 모든 인스턴스를 try-excepts에 두지 않고 질문 제어 로직 때로는 생각보다 더 많이 말이됩니다.

굉장히 빠른 것에 대해 모두에게 감사 드리며, QuestionFail에 대해 unutbu에게 사과드립니다.

+0

문제는 조금 불분명하고, 특정 값에 도달하면 데이터를 통해 반복하는 중지 할. 루프로지도를 분해했다면 어떻게 보이는지 보여 줄 수 있습니까? – Claudiu

답변

10

는 아마도 음모를 꾸미고 도서관에서 약간의 트릭이, 그러나 훨씬 더 나은 옵션은 시작하는 등 데이터를 생성하지 보인다. 그것은 (플로팅 라이브러리 대신 반복 가능한 목록을 필요로하는 경우와 list에 대한 호출에 포장) map 당신에게 코드의 서른 줄 ...

사용 itertools.takewhile(lambda y: y != NO_VALUE, (f(y) for y in yvals))을 절약하는 것이 아니다.

편집 : 나는 더 나은 생각을했다 : 래퍼에서 "iterale의 끝을"신호 예외입니다

except ValueError: 
    raise StopIteration 

map 점을 추가합니다.

+0

imap()은 이전 솔루션에 대한 메모입니다. imap()은 iterator 버전의 map()이므로 모든 데이터를 처리하지 않고도 takewhile을 사용할 수 있습니다. 그러나 최근의 Python 버전이 필요합니다. –

+0

@Gustav Larsson :'map'은'imap'이 생성자 표현식이므로 이해력을 나열합니다. 그리고 나는 여기를 포함하여 할 수있을 때마다 생성자 표현식을 사용하고 있습니다. – delnan

0

데이터가있는 것처럼 보이며 마지막 지점을 플롯하지 않으려 고합니다. 그럼 계획을 세우지 않으시겠습니까?

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

이렇게하면 마지막 항목이 잘립니다. OP는 그것이 항상 가짜 데이터를 포함하는 마지막 항목이라는 것을 밝혔습니까? – delnan

+0

@delnan : 그것이 내가 이해 한 것입니다. "이것은 데이터를 올바르게 그리고 데이터가 끝나면 절벽에서 떨어졌습니다." 항상 마지막 항목이 아니라면 메서드가 적절할 것입니다. – 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() 

yval는 지난 10 개 값은 마스크되기 때문에, 그래프는 89과 동일 xval 끝나는 것을 enter image description here

통지를 산출한다.

+0

이 경우에는 log10이지만이 위치는 어디에서 좋아합니다. 조사하고 업데이트 할 것입니다 (귀하 또는 다른 사람이 나를 때리지 않는 한!) – Bolster

+0

실제로 응답을 사용하고 있지만 엄밀히 말하자면, Stripped-of-other-dependencies 질문은 StopIteration 응답으로 응답되었습니다. – 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_)