9

汎用データのパイプロッティングを行って、それを電力値からdB値に変換しています。これらの値が由来するシステムにより、0は「有用なデータはここで終了します」インジケーターとして使用されます(定義された値ではなく、数学の性質)。

これらを処理する私の通常の方法は、変換をtry / exceptionでラップし、デフォルトの「low」値を返すことです。

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()を完全に廃止することです。

マップをループに分割する以外に、素晴らしいアイデアを思いついた人はいますか?

更新:

私はPylab/MatplotLibを使用しています。「エンドポイント」は実行に依存します。「悪い」値がないため、上記がまったく問題にならない場合があります。これはすべて、私が怠惰になり、ydataの最小値に基づいて動的ylimをリセットする代わりにmatplotlibsグラフスケーリングを使用するための努力です(これはatmではなく、この場合はylim(-140)だけです)。

回答に関する漠然と重要な更新:この定期的に使用される関数でStopIterationを発生させると、質問とは無関係に大混乱が発生するため、unutbuの回答は、実際に実装に使用するものです(質問の依存関係には記載されていません)。他のすべてのインスタンスをtry-exceptsに入れないで、ロジックを制御します。時々-infはあなたが思っているよりも理にかなっています。

素晴らしく速いことをみんなに感謝します、そして私はQuestionFailのためにunutbuに謝罪します。

4

4 に答える 4

10

おそらく、プロットライブラリにはいくつかのトリックがありますが、はるかに優れたオプションは、そもそもそのようなデータを生成しないようです。map30行のコードを節約できるわけではありません...

使用します(そして、プロットライブラリが反復可能ではなくリストを必要とitertools.takewhile(lambda y: y != NO_VALUE, (f(y) for y in yvals))する場合はへの呼び出しでそれをラップします)。list

編集:私はさらに良いアイデアを持っていました:ラッパーに追加します

except ValueError:
    raise StopIteration

これは「イテラーレの終わり」を示す例外であり、それをmap尊重します。

于 2011-03-30T17:02:17.470 に答える
2

を使用している場合はmatplotlib、をインストールしたことを意味しますnumpy

に変換しているのでdB、ログを取っているようです。その場合、np.log(0) = -inf

numpy関数np.ma.masked_invalidを使用してnansと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()

収量 ここに画像の説明を入力してください

xvalの最後の10個の値yvalがマスクされているため、グラフは89で終わることに注意してください。

于 2011-03-30T17:04:53.830 に答える
1

ループ構造の使用を拒否することで、不必要に自分自身を制限しています。

あなたの状況では、特定の値に達したときにデータの反復を停止したいのですが、それがまさにその目的ですforloopsbreaks

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

p1.plot(xvals[:len(yvals_)],yvals_)
于 2011-03-30T17:07:38.420 に答える
0

データがあるようで、最後の点をプロットしたくありません。では、それをプロットしないのはどうですか?

pl.plot(xvals[:-1], map(f, yvals)[:-1])
于 2011-03-30T17:00:49.573 に答える