Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

numpy.errstateで対数をとった時のwarningを無視する

音信号処理のプログラムを書いていると、

import numpy as np
y_array = np.log10(x_array)

のように対数をとることがよくあります。

ここで、x_array には 0 が含まれていることが多々あり、その場合には

RuntimeWarning: divide by zero encountered in log10

と warning が出力されてしまいます。

これを手際よく解決する手段を調べてみると、numpy.errstate()という関数があることが分かりました。

numpy.errstate — NumPy v1.19 Manual

使用例:

import numpy as np
spec = np.random.random(5)
spec[2] = 0.0
np.log10(spec)
#>>> RuntimeWarning: divide by zero encountered in log10
#>>> array([-0.94448398, -0.05531926,        -inf, -0.44129004, -0.17107346])
with np.errstate(divide='ignore'):
    np.log10(spec)
#>>> array([-0.94448398, -0.05531926,        -inf, -0.44129004, -0.17107346])

また、上記の例では入力が0の場合のwarningでしたが、np.errstate(invalid='ignore')とすることで、対数の入力が負の時に発生するwarningも非表示にできます。

a = -1
with np.errstate(divide='ignore'):
    np.log10(a)
#>>> RuntimeWarning: invalid value encountered in log10
#>>> nan
with np.errstate(divide='ignore', invalid='ignore'):
    np.log10(a)
#>>> nan

f:id:Kurene:20210102231146p:plain