ゼロ除算

ゼロで割るとどうなるかは言語によります。

R で 1 / 0 と打ち込むと Inf(Infinity = 無限大)と返ってきます。0 / 0NaN(Not a Number = 非数)になります。いずれにしても、エラーで止まることはありません。

Ruby では 1 / 00 / 0 は ZeroDivisionError になって止まりますが 1.0 / 0.0Infinity0.0 / 0.0NaN になります。C言語でも同じです。

ところが Python では 0 で割っても 0.0 で割っても ZeroDivisionError になり、そこで実行が止まってしまいます。これでは不便です。もちろん

try:
    x = a / b
except ZeroDivisionError:
    if a == 0:
        x = float("nan")
    else:
        x = float("inf")

のようなことはできますが、面倒です。

NumPy の数値(array の要素など)であれば大丈夫です:

import numpy as np

a = np.array([1, 0, 0])
print(a[0] / a[1])
print(a[1] / a[2])
inf
nan

配列の要素でない数の場合は np.float64(0) のようにします。np.array(0) でもかまいません。

ただし、RuntimeWarning(実行時の警告)が出ます。RuntimeWarning を出したくなければ、あらかじめ

np.seterr(divide="ignore", invalid="ignore")

と打ち込んでおきます(invalid とは 0/0 のこと)。元に戻すには

np.seterr(divide="warn", invalid="warn")

とします(詳しくは np.seterr のヘルプ参照)。

特定の割り算だけ warn しないようにするには

with np.errstate(divide="ignore", invalid="ignore"):
    x = a / b

のようにします。