我想替换列表中的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?。
2条答案
按热度按时间vawmfj5a1#
您可以使用
numpy.clip
:ccrfmcuu2#
对于不依赖于
numpy
的替代方案,您总是可以如果你只想设置一个上限,你当然可以写
arr = [min(x, upper_bound) for x in arr]
,或者类似地,如果你只想设置一个下限,你可以用max
代替。在这里,我将两个操作一起应用。
**编辑:**下面是稍微深入一点的解释:
给定数组的一个元素
x
(并假设您的upper_bound
至少与lower_bound
一样大!),您将遇到以下三种情况之一:x < lower_bound
x > upper_bound
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
。在这三种情况下,输出都是我们想要的。