

Python 3.10.7 で下記のコードを動かしたところ警告が表示されます。

**実行時の警告:**

[code]

    numpy_test.py:5: RuntimeWarning: divide by zero encountered in log
      np_ret = np.where(np_val <= 0.5, np.sqrt(np_val), np.log(np_val))
    [0.]
    
[/code]

`print(ret_val)` の表示は `[0.]` ですので、`np_func()` は `np.sqrt(0)` の値を返していると考えています。  
その為、おそらく `np_func()` に `np.zeros(1)` が渡された際に、条件を満たす `np.sqrt(np_val)`
だけでなく、条件を満たさない `np.log(np_val)` も計算することで警告が出ているのだと思うのですが、認識はあっていますでしょうか？

できれば、今回のような実際には使用されない計算における警告は無視したいのですが、何か方法はありますでしょうか？

**ソースコード:**

[code]

    import numpy as np
    
    
    def np_func(np_val):
        np_ret = np.where(np_val <= 0.5, np.sqrt(np_val), np.log(np_val))
        return np_ret
    
    
    def test_numpy():
        np_val = np.zeros(1)
        ret_val = np_func(np_val)
        print(ret_val)
    
    
    if __name__ == "__main__":
        test_numpy()
    
[/code]


CC BY-SA 4.0
2022-10-03T13:23:20.463
91424
2022-10-03T16:45:19.633
2022-10-03T16:12:45.380
3060
4260
question
python python3 numpy
numpyにおける"RuntimeWarning: divide by zero encountered in log"の対処方法


warningsモジュールを利用するのは如何でしょうか．  
(追記) コンテキストマネージャが利用できます．

[code]

    import warnings
    
    import numpy as np
    
    
    def np_func(np_val):
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')
            np_ret = np.where(np_val <= 0.5, np.sqrt(np_val), np.log(np_val))
        return np_ret
    
    def test_numpy():
        np_val = np.zeros(1)
        ret_val = np_func(np_val)
        print(ret_val)
    
    
    if __name__ == "__main__":
        test_numpy()
    
    
[/code]

参考: [warnings --- 警告の制御 / Python3.10.6
document](https://docs.python.org/ja/3/library/warnings.html#warnings.simplefilter)


CC BY-SA 4.0
2022-10-03T13:42:40.300
91426
2022-10-03T14:41:44.893
2022-10-03T14:41:44.893
51374
51374
91424
answer


一時的に無視する方法

[code]

    def np_func(np_val):
        with np.errstate(divide='ignore'):
            np_ret = np.where(np_val <= 0.5, np.sqrt(np_val), np.log(np_val))
        return np_ret
    
[/code]


CC BY-SA 4.0
2022-10-03T14:39:38.300
91428
2022-10-03T14:39:38.300
43025
91424
answer


`numpy.log()` の `where` キーワードを使う方法もあります。

[code]

    def np_func(np_val):
        np_ret = np.where(np_val <= 0.5, np.sqrt(np_val), np.log(np_val, where=(np_val!=0)))
        return np_ret
    
[/code]


CC BY-SA 4.0
2022-10-03T16:45:19.633
91430
2022-10-03T16:45:19.633
47127
91424
answer