python
machine_learning
値が有効な範囲から 通常のスカラー値ならif文や、あるいは器用ににminとmaxを使って
a = 10 # if文で丸め if a < 0: a = 0 if a = 5: a = 5 print(a) 5 b = 10 # minとmaxで b = max(b, 0) b = min(b, 5) print(b) 5のように値の丸めこみができる。
これ同様のことをNumPy配列型np.ndarrayでやるにはnp.clipを 使う。 これでndarrayの各要素に関して、指定した最大値より大きい要素を最大値、 最小値より小さい要素を最小値に丸め込んでくれる。
np.clip(array, [最小値], [最大値])
のようにして使う。
In [1]: import numpy as np In [2]: a = np.asarray([[1, 2, 3], [4, 5, 6]]) In [3]: np.clip(a, 2, 5) Out[3]: array([[2, 2, 3], [4, 5, 5]])
使用例
個人的にclipを一番よく使うのはfloat32からunsigned int8などの型変換のときだ。 画像処理ライブラリなどだと画素値を0 -- 255の値で扱うためにuint8型を要求されることが多いが、 うっかりfloat型をそのまま型変換すると、256以上の値が桁あふれにより折り返してきてしまい問題がおこる 場合がある。このときにclipで0以下や255以上の値を処理しておけば「黒つぶれ」「白飛び」で範囲外の値に対応できたことになり、 画像としてはこの方が見た目がよい(情報が失われていることには変わりないが)。
In [1]: import numpy as np In [2]: a = np.asarray([i for i in range(258)]) In [3]: a.astype(np.uint8) Out[3]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, # (中略) 247, 248, 249, 250, 251, 252, 253, 254, 255, 0, 1], dtype=uint8) # 最後のほうに0への折り返しが発生していておかしい! In [4]: a.astype(np.uint8) Out[4]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, # (中略) 247, 248, 249, 250, 251, 252, 253, 254, 255, 255, 255], dtype=uint8) # 255より大きい値が出ない