NumPy配列ndarrayを任意の最小値・最大値に収めるclip
NumPy配列ndarrayの要素の値を任意の範囲内に収めるクリッピング処理を行うにはnp.clip()またはndarrayのclip()メソッドを使う。引数に最小値と最大値を指定すると、その範囲外の値は最小値または最大値に置き換えられる。
本記事のサンプルコードのNumPyのバージョンは以下の通り。バージョンによって仕様が異なる可能性があるので注意。
import numpy as np
print(np.__version__)
# 1.26.1
source: numpy_clip.py
np.clip()の使い方
np.clip()では、第一引数aに処理する配列ndarray、第二引数a_minに最小値、第三引数a_maxに最大値を指定する。
a = np.arange(10)
print(a)
# [0 1 2 3 4 5 6 7 8 9]
print(np.clip(a, 2, 7))
# [2 2 2 3 4 5 6 7 7 7]
source: numpy_clip.py
最小値と最大値のどちらか一方のみを指定したい場合はNoneを使う。省略はできない。
print(np.clip(a, None, 7))
# [0 1 2 3 4 5 6 7 7 7]
print(np.clip(a, 2, None))
# [2 2 2 3 4 5 6 7 8 9]
# print(np.clip(a, 2))
# TypeError: clip() missing 1 required positional argument: 'a_max'
source: numpy_clip.py
a_minがa_maxより大きくてもエラーにはならず、すべての値がa_maxとなる。
print(np.clip(a, 7, 2))
# [2 2 2 2 2 2 2 2 2 2]
source: numpy_clip.py
クリップされたndarrayを返し、元のndarrayはそのまま変化なし。
a_clip = np.clip(a, 2, 7)
print(a_clip)
# [2 2 2 3 4 5 6 7 7 7]
print(a)
# [0 1 2 3 4 5 6 7 8 9]
source: numpy_clip.py
第一引数aにはndarrayだけでなく、Python組み込みのリストなどのいわゆるarray-likeオブジェクトを指定可能。返り値は常にndarray。
l = list(range(10))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(np.clip(l, 2, 7))
# [2 2 2 3 4 5 6 7 7 7]
print(type(np.clip(l, 2, 7)))
# <class 'numpy.ndarray'>
source: numpy_clip.py
ndarrayのclip()メソッドの使い方
ndarrayのclip()メソッドでは、第一引数minに最小値、第二引数maxに最大値を指定する。
a = np.arange(10)
print(a)
# [0 1 2 3 4 5 6 7 8 9]
print(a.clip(2, 7))
# [2 2 2 3 4 5 6 7 7 7]
print(a.clip(None, 7))
# [0 1 2 3 4 5 6 7 7 7]
print(a.clip(2, None))
# [2 2 2 3 4 5 6 7 8 9]
source: numpy_clip.py
np.clip()と異なり、第一引数min、第二引数maxにデフォルト値Noneが設定されているため省略してもよい。np.clip()と引数名が微妙に違うので、キーワード引数として引数名で指定する場合は注意。
print(a.clip(2))
# [2 2 2 3 4 5 6 7 8 9]
print(a.clip(min=2))
# [2 2 2 3 4 5 6 7 8 9]
print(a.clip(max=7))
# [0 1 2 3 4 5 6 7 7 7]
source: numpy_clip.py
np.clip()と同様、minがmaxより大きい場合は、すべての値がmaxとなる。
print(a.clip(7, 2))
# [2 2 2 2 2 2 2 2 2 2]
source: numpy_clip.py
np.clip()と同様、クリップされたndarrayを返し、元のndarrayはそのまま変化なし。
a_clip = a.clip(2, 7)
print(a_clip)
# [2 2 2 3 4 5 6 7 7 7]
print(a)
# [0 1 2 3 4 5 6 7 8 9]
source: numpy_clip.py