Python では区分関数をどのように定義するのでしょうか?以下は区分関数です。
最初に、要素ごとにのみ実行できる log_norm0 の単純なバージョンを作成しました。言うまでもなく、要素の数が多いベクトルは確実に遅くなります。
その後、インジケータ関数を使用してセグメンテーションの 2 つの状況を区別することを考え、log_norm1 を取得しました。ただし、この状況は非常に特殊であり、毎回正常に構築できるわけではありません。
関連する推奨事項: "Python ビデオ チュートリアル "
最後に、関数 Piecewise(x, condlist, funclist, *args, **kw) があることがわかりました。 numpy では、セグメント化された関数を構築するために特別に使用されます。x は入力、condlist はセグメント化の条件を表し、funclist は対応するセグメントの処理関数を表します。これにより、log_norm2 が得られます。
# elementwise def log_norm0(x): if x >= 0: return np.log(x + 1) else: return - np.log(- x + 1) # indicator def log_norm1(x): # ind = np.where(x > 0, 1, 0) ind = (x > 0) return np.log(x * ind + 1) - np.log(- x * (1.0 - ind) + 1) # numpy.piecewise() def log_norm2(x): return np.piecewise(x, [x >= 0, x < 0], [lambda x: np.log(1 + x), lambda x: - np.log(1 - x)])
最後に、各関数の実行時間を観察します。
tic = time.time() for i in range(x.size): y[i] = log_norm0(x[i]) toc = time.time() print('log0: ', toc - tic) tic = time.time() y = log_norm1(x) toc = time.time() print('log1: ', toc - tic) tic = time.time() z = log_norm2(x) toc = time.time() print('log2: ', toc - tic)
観察結果は、インジケーター関数を使用する方法が依然として最速であることを示していますが、区分的方法とあまり変わりません。
rree以上がPython で区分関数を定義する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。