1. ホーム
  2. python

[解決済み] Numpyのゼロ除算がnp.where()のtrue_divideで発生した。

2022-02-08 13:43:25

質問

を取得したとき np.where がゼロによる除算を回避しようとする場合にも、エラーが発生します。 p_arr - 0.5 は常に > 0 .

mo = np.where(p_arr > 0.5, -6.93/(p_arr - 0.5), 10)

RuntimeWarning: ゼロによる除算が true_divide で発生しました。

<ブロッククオート

mo = np.where(p_arr > 0.5, -6.93/(p_arr - 0.5), 10)

その理由と修正方法に心当たりはありますか?さらに、エラーにp_arrからの正確な値が表示されるように、それを適切にデバッグする方法はありますか?

いくつかのテスト

x = np.where(p_arr > 0.5, p_arr, 1)
print(np.all((p_arr - 0.5 != 0))) # FALSE
print(np.all((x - 0.5 != 0))) # TRUE

解決方法は?

の疑似コードです。 np.where :

def np_where(chooser, true_opt, false_opt):
    out = np.empty(chooser.shape, dtype = true_opt.dtype) 
    out[~chooser] = false_opt
    return out

重要なこと true_opt が生成されます。 以前 が関数を呼び出します。 そのため、もしその中の何かがエラーを起こしても、インタープリターは np.where - であっても np.where の部分を使うことはないでしょう。 true_opt というエラーが発生します。

を取り除くことができます。 divide by zero エラーは発生しませんが np.seterr 他の回答で推奨されているように、セッション全体が停止してしまい、他のコードで問題が発生する可能性があります。 このようにすることができます。

with np.errstate(divide='ignore'):
    mo = np.where(p_arr > 0.5, -6.93/(p_arr - 0.5), 10)

エラーの原因がどこにあったかを調べるには、ただ

np.where(p_arr == 0.5)

を取得していた座標が表示されるはずです。 divide by zero エラー