LoginSignup
0
0

More than 3 years have passed since last update.

【Python】numpyの平均、標準偏差、最大・最少におけるinfとNaNの扱い方

Last updated at Posted at 2020-09-10

発生した問題

python3でnumpyを用いた画像処理(画像評価)ソフトの出力に,
平均・標準偏差・最大・最小にinfとNaNが含まれる.

sample_code.py
import numpy as np
img = #なんか画像の配列

print(np.max(img))
print(np.min(img))
print(np.mean(img))
print(np.std(img))

>inf
>-inf
>NaN
>NaN

こんな感じ
結構ハマった

inf,NaNとは

そもそもinfとかNaNってなんなんでしょうね?(激うまギャク)
調べると沢山情報が出てきました.

inf

infinityの略.無限大を表す.
-infは負の無限大なわけですね.

NaN

浮動小数点数にはNaN (Not a Number, 非数) と呼ばれる、実数の異常な値を表す特殊な数があります。
これは無限大-無限大、0.0/0.0といった不定形や、負数の平方根、負数の対数といった実数で表せない計算を行った場合に発生します。

NaNのお話より

僕の理解では,考慮したくない・計算時に除外する値(数)って認識です.

対策方法

1.infをNaNに置き換える

sample_code.py
import numpy as np
img = #なんか画像の配列

img[img == -np.inf] = np.nan
img[img == np.inf] = np.nan

これで配列からinfは消えました.次に進みましょう

2.NaNを考慮した関数を使う

sample_code.py
import numpy as np
img = #なんか画像の配列

img[img == -np.inf] = np.nan
img[img == np.inf] = np.nan

最小, 最大 = np.nanmax(img), np.nanmin(img)
平均 = np.nanmean(img)
標準偏差 = np.nanstd(img)

#他にも合計や分散もある

参考:https://note.nkmk.me/python-numpy-nansum/

3.理解を深めるためのお話

これどういう処理をしてるんだろうってお話です.
最大や平均を求めるときにNaN要素を除外して計算しています.
例えば平均の計算ですと,全体の合計値に含ませないし要素の数にも含みません.

配列の中からNaNってやつを削除してしまうイメージ.
じゃあ削除すればいいじゃんと思うかもしれませんが,画像処理ではそうもいかんです.
削除してしまったら画像の縦横の大きさとかくるってしまいますからね.

とりあえず,0で割ったり0を割ったりしてるとinfやNaNが含まれてしまうので,
そういった処理をしているソフトなら基本的に上の処理を行いましょうねといった感じでしょうか.

あとがき

このことに気づくのって結構大変でした.
自分はよくimageJでやるような画像処理の作業を自動化してるのですが,
ソフトの出力結果とimageJで処理した結果が違ってたので気づけました.
infは除外しちゃうんだ~って感じましたね.画像処理の世界では常識なんですかね?

0
0
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
0
0