numpy 用上下边界替换列表值的Python方法(钳位、剪切、阈值)?

iibxawm4  于 2023-02-04  发布在  Python
关注(0)|答案(2)|浏览(176)

我想替换列表中的outliner,因此我定义了一个上下限,现在upper_bound以上和lower_bound以下的值都被替换为这个上下限,我的方法是使用numpy数组分两步完成。
现在我想知道是否有可能一步完成,因为我想这可以提高性能和可读性。

  • 有没有捷径可走 *
import numpy as np

lowerBound, upperBound = 3, 7

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr[arr > upperBound] = upperBound
arr[arr < lowerBound] = lowerBound

# [3 3 3 3 4 5 6 7 7 7]
print(arr)

有关钳制单个值(包括非Numpy方法),请参见How can I clamp (clip, restrict) a number to some range?

vawmfj5a

vawmfj5a1#

您可以使用numpy.clip

In [1]: import numpy as np

In [2]: arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [3]: lowerBound, upperBound = 3, 7

In [4]: np.clip(arr, lowerBound, upperBound, out=arr)
Out[4]: array([3, 3, 3, 3, 4, 5, 6, 7, 7, 7])

In [5]: arr
Out[5]: array([3, 3, 3, 3, 4, 5, 6, 7, 7, 7])
ccrfmcuu

ccrfmcuu2#

对于不依赖于numpy的替代方案,您总是可以

arr = [max(lower_bound, min(x, upper_bound)) for x in arr]

如果你只想设置一个上限,你当然可以写arr = [min(x, upper_bound) for x in arr],或者类似地,如果你只想设置一个下限,你可以用max代替。
在这里,我将两个操作一起应用。

**编辑:**下面是稍微深入一点的解释:

给定数组的一个元素x(并假设您的upper_bound至少与lower_bound一样大!),您将遇到以下三种情况之一:

  1. x < lower_bound
  2. x > upper_bound
  3. lower_bound <= x <= upper_bound .
    在案例1中,max/min表达式首先计算为max(lower_bound, x),然后解析为lower_bound
    在情况2中,表达式首先变为max(lower_bound, upper_bound),然后变为upper_bound
    在案例3中,我们得到max(lower_bound, x),它解析为x
    在这三种情况下,输出都是我们想要的。

相关问题