LoginSignup
1
3

Pythonでの0割り警告を回避するためのNumPy np.divide()関数の活用法

Last updated at Posted at 2023-11-02

はじめに

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. ]

コードの説明

  1. zero_div_valuesに0割りが発生した場合の値を入れます。
  2. np.divide()out引数にzero_div_valuesを入れます。out引数に指定した型が戻り値の型になります。割り算なので、zero_div_valuesの配列はint型では使用できません
    (なお、out引数を何も指定しない場合は、where条件がFalseの時はa値が使われます。)
  3. 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()関数を使用する方法を紹介しました。

本記事が誰かの役に立てば幸いです。

参考資料

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3