JP / EN

広告

NumPy np.clip: 値の範囲を指定した最大値・最小値に丸めこむ

タグ: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より大きい値が出ない

  


このエントリーをはてなブックマークに追加

https://wonderhorn.net/