はじめに
Pythonでの0割りの警告を回避するために、様々な方法が存在します。例えば、下記の記事が参考になります。
本記事では、numpyのdivide()
関数を使った回避方法を紹介します。
方法
本記事の実装環境は、以下の通りです。
- Python 3.8.1
- numpy 1.23.5
本記事の実装コードはGoogle Colabこちらから確認できます。
結論として、np.divide()
のwhere
引数を指定することで、0割りエラーを出さずに表示できます。以下はサンプルコードです。
NumPy配列での方法
NumPy配列での0割りがある場合の例です。
numpy配列でのサンプル
import numpy as np
a = np.array([1, 2, 3])
b = np.array([10, 10, 0])
zero_div_values = np.zeros_like([0., 0., 0.])
divided = np.divide(a, b, out=zero_div_values, where=(b!=0))
print('a =', a)
print('b =', b)
print('a/b =', divided)
出力
a = [1 2 3]
b = [10 10 0]
a/b = [0.1 0.2 0. ]
コードの説明
-
zero_div_values
に0割りが発生した場合の値を入れます。 -
np.divide()
のout
引数にzero_div_values
を入れます。out
引数に指定した型が戻り値の型になります。割り算なので、zero_div_values
の配列はint
型では使用できません。
(なお、out
引数を何も指定しない場合は、where
条件がFalse
の時はa
値が使われます。) -
np.divide()
のwhere
引数を使用して、0割りの条件を指定します。where=(b!=0)
とすると、b
がゼロでない場合でのみ割り算が実行され、ゼロの場合はzero_div_value
が使われます。
Pythonの変数での方法
Pythonの変数を使った場合について説明します。
Pythonの変数でのサンプル
import numpy as np
a = 1
b = 0
zero_div_value = np.array([0.])
divided = np.divide(a, b, out=zero_div_value, where=(b!=0))
divided_val = divided[0]
print('a =', a)
print('b =', b)
print('a/b =', divided_val)
出力
a = 1
b = 0
a/b = 0.0
out
引数に適当な値を入れる際は、zero_div_value
にNumPyの配列を使う必要があります。その他は、NumPy配列での例と同様です。
補足
なお、np.where()
を使用する方法でも同様の処理が行えますが、警告が表示される点に留意してください。
np.where()だとwarningが出てしまうコード
import numpy as np
a = np.array([1, 2, 3])
b = np.array([10, 10, 0])
divided = np.where(b != 0, a / b, 0)
出力
<ipython-input-60-cb56d63d9de7>:7: RuntimeWarning: divide by zero encountered in divide
divided = np.where(b != 0, a / b, 0)
まとめ
Pythonでの0割り警告を回避するために、NumPyのnp.divide()
関数を使用する方法を紹介しました。
本記事が誰かの役に立てば幸いです。
参考資料