用上限和下限(钳制、剪裁、阈值)替换列表值的Python方法?

用上限和下限(钳制、剪裁、阈值)替换列表值的Python方法?,python,arrays,numpy,clip,clamp,Python,Arrays,Numpy,Clip,Clamp,我想替换列表中的大纲视图。因此,我定义了上限和下限。现在,上限和下限下的每个值都将替换为界值。我的方法是使用numpy数组分两步完成 现在我想知道是否可以一步完成,因为我想它可以提高性能和可读性 有没有较短的方法可以做到这一点 将numpy导入为np 下界,上界=3,7 arr=np.数组([0,1,2,3,4,5,6,7,8,9]) arr[arr>上限]=上限 arr[arr上限的中间数组,如果数组变大,这可能会成为一个问题。@hpaulj感谢您的评论。我所说的“pythonic”是指短而快

我想替换列表中的大纲视图。因此,我定义了上限和下限。现在,
上限
下限
下的每个值都将替换为界值。我的方法是使用numpy数组分两步完成

现在我想知道是否可以一步完成,因为我想它可以提高性能和可读性

有没有较短的方法可以做到这一点

将numpy导入为np
下界,上界=3,7
arr=np.数组([0,1,2,3,4,5,6,7,8,9])
arr[arr>上限]=上限
arr[arr
您可以使用
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])

对于不依赖于
numpy
的替代方案,您始终可以这样做

arr = [max(lower_bound, min(x, upper_bound)) for x in arr]
如果您只是想设置一个上限,那么当然可以在arr中为x编写
arr=[min(x,上限)]
。或者类似地,如果您只是想要一个下限,您可以使用
max

在这里,我刚刚应用了两个操作,一起编写

编辑:这里有一个更深入的解释:

给定数组的元素
x
(假设你的
上限
至少与你的
下限
一样大),你将有三种情况之一:

  • x
  • x>上限

  • lower_bound嗨@arthur,谢谢,这正是我要找的!不知何故,我错过了关键词
    clip
    ,自己也没有找到方法……我想知道
    clip
    是怎么写的。它可能也在做同样的事情,只是包装在一个函数调用中。@hpaulj你发现了吗?AFAICT看起来像是在C中。与许多其他函数一样,
    np.clip
    是python,但它遵从
    arr.clip
    ,方法。对于正则数组,该方法是编译的,所以速度会更快(大约2倍)。我的抱怨是(没有投票权),当我看到max/min组合时,我倾向于认真思考,发现它们没有那么可读性。@djechlin当然,我不同意这一点。另一方面,关于这一点的另一个答案是使用
    numpy.clip
    ,如果我在某处遇到它,我可能不会立即阅读它——我可能想仔细检查一下numpy文档,或者猜测它做了什么,并希望作者做对了。奇怪的是嵌套。这是一个非常对称的操作,包括“剪辑一次”,剪辑两次。“这是”剪辑一次,然后再剪辑那个。”@djechlin好吧……嗯。我想,“剪辑一次,剪辑两次”听起来很像“剪辑一次,然后再剪辑那个”所以我不确定我是否完全理解你的反对意见。但我同意同时使用max/min会带来一些认知负荷……或者,需要一些解释。因此,我试图给出一个(简短的)解释以及代码。(然而,我在评论中所说的比我在回答中所说的要多得多,所以这表明我的回答可能有点太简短了!)很好的一句话!有一个替代的解决方案总是好的——正如我必须说的,它缺乏可读性虽然有一个编译的
    clip
    方法很好,但是你的代码没有任何不符合pythonic的地方。这是对
    numpy
    的完美使用,并且同样可读(对于有经验的用户)。把这个概念放在你的工具箱里;它适用于不太适合
    剪辑
    模型的情况。此操作通常称为夹紧、剪辑或阈值。您应该使用
    剪辑
    方法,但除了速度之外还有另一个原因;您的代码很优雅,但创建了一个带有
    arr>上限的中间数组,如果数组变大,这可能会成为一个问题。@hpaulj感谢您的评论。我所说的“pythonic”是指短而快。我知道我的解决方案不是unpythonic,但是
    clip()
    方法对于我的特殊用例已经足够了。步骤1)自己动手2)理解概念3)使用库是一个很好的方法:)