Pythonic方法限制变量的范围?

时间:2017-06-15 09:05:35

标签: python python-3.x clipping

有更好的方法吗?

if a > 1:
    a = 1
if a < 0:
    a = 0

我正在考虑使用一个函数,因为我的代码中有很多这样的函数, 很奇怪是否有更简单易懂的方法。

2 个答案:

答案 0 :(得分:8)

您描述的内容通常称为剪辑。有几种方法可以进行裁剪。

图书馆(numpy

您可以使用numpy.clip

numpy.clip(a, a_min, a_max, out=None)

所以:

import numpy

numpy.clip(x,0,1)

虽然由于Python中的函数调用很昂贵,并且numpy通常批量处理数据,但对于单个值,它将导致计算开销。

例如:

>>> x = -2.5
>>> numpy.clip(x,0,1)
0.0
>>> x = 2.5
>>> numpy.clip(x,0,1)
1.0
>>> x = 0.5
>>> numpy.clip(x,0,1)
0.5

通常您使用numpy对(大)矩阵执行操作,例如,如果您必须处理1000x1000矩阵,那么使用numpy肯定会得到回报。

纯Python

纯python方法可以通过以下方式获得:

max(0,min(1,x))

但是这里有两次调用,因此,它比使用if语句要慢。

最后,如果你坚持使用if - 代码,你可以使用elif来优化它:

if x < 0:
    x = 0
elif x > 1:
    x = 1

或更通用的功能:

def clip(x,min,max):
    if x < min:
        return min
    elif x > max:
        return max
    return x

答案 1 :(得分:4)

我总是使用像max(0, min(1, x))这样的东西。 如果x大于1,min(1, x)将为1,max(0, 1)仍为1。 如果x小于0,min(1, x)将为xmax(0, x)将为0。