2016年07月23日

numpyで数値が指定範囲にいない場合に、指定範囲のmin/maxに置き換えたい

とある数値について、0.0〜1.0の間にいて欲しいのに-0.1とか1.1みたいな値が混ざっていた場合。

# マイナスや1.0を超えた値が混ざる適当なDataFrameをでっち上げる
df = pd.DataFrame(1.3 * np.random.random([5, 2]) - 0.2, columns=['A', 'B'])
    #=>           A         B
    #=> 0  0.418959  0.127008
    #=> 1  0.766270  0.939455
    #=> 2  1.019421 -0.193150
    #=> 3  0.802732  0.909558
    #=> 4  0.197882 -0.067508

これを1.0以上だったら1.0に、0以下だったら0.0に変換したい。

これまで適当にこんな風に書いていた。

np.fmin(1.0, np.fmax(0.0, df))

どう考えても良い書き方とは思えないので調べたら、np.clipという関数が出てきた。引数に配列、min、maxの3つを指定することで範囲内に収められるらしい。

np.clip(df, 0.0, 1.0)
    #=>           A         B
    #=> 0  0.418959  0.127008
    #=> 1  0.766270  0.939455
    #=> 2  1.000000  0.000000
    #=> 3  0.802732  0.909558
    #=> 4  0.197882  0.000000