Arrays 如何为Numpy数组中的每个项目设置最小值和最大值?

Arrays 如何为Numpy数组中的每个项目设置最小值和最大值?,arrays,python-3.x,numpy,Arrays,Python 3.x,Numpy,假设我有一个numpy数组 a = np.array([1, 100, 123, -400, 85, -98]) 我想将每个值限制在-100和90之间。基本上,我希望numpy数组是这样的: a = np.array([1, 90, 90, -100, 85, -98]) 我知道这可以通过迭代numpy数组来完成,但是有没有其他有效的方法来执行此任务?我认为获得结果的最简单方法是使用numpy的clip函数 import numpy as np a = np.array([1, 100, 1

假设我有一个numpy数组

a = np.array([1, 100, 123, -400, 85, -98])
我想将每个值限制在
-100
90
之间。基本上,我希望numpy数组是这样的:

a = np.array([1, 90, 90, -100, 85, -98])

我知道这可以通过迭代numpy数组来完成,但是有没有其他有效的方法来执行此任务?

我认为获得结果的最简单方法是使用numpy的clip函数

import numpy as np
a = np.array([1, 100, 123, -400, 85, -98])
np.clip(a,-100,90)

有几种方法可以做到这一点。首先,使用Sridhar Murali提出的numpy函数:

a = np.array([1, 100, 123, -400, 85, -98]) 
np.clip(a,-100,90)
其次,使用numpy数组比较:

a = np.array([1, 100, 123, -400, 85, -98])
a[a>90] = 90
a[a<-100] = -100
至于编码风格,我更喜欢numpy比较或列表理解,因为它们清楚地说明了所做的事情,但这实际上取决于您。至于速度,用
timeit.repeat
重复10万次,我平均得到,从最好到最差:

  • 4.8e-3秒,用于列表理解
  • 1.8e-1秒用于numpy阵列比较
  • np.clip功能为2.7e-1秒

  • 显然,如果之后不需要数组,那么列表理解就是一种方法。如果您需要数组,直接比较的效率几乎是
    clip
    函数的两倍,同时可读性更高。

    /hi!你不想使用列表理解有什么原因吗?@jeannej我认为它在速度方面效率低下@ѕєєѕιι事实上恰恰相反,我将发布一个答案,证明我不明白为什么这被选为最佳答案,同时又具有误导性。如果您报告说直接比较的执行时间较短,那么直接比较如何比剪辑“更有效”?不,列表理解是很酷的合成糖,但如果你有大型数组,矢量化是获得大规模加速的关键,那么它就不是一种方法。在计时过程中,您很幸运,因为数组一开始非常小。@BS。我想你错过了4.8e-3秒=0.0048秒和1.8e-1秒=0.18秒。。。所以在我的测试用例中,列表理解确实需要更少的时间来执行。当然,时间比较取决于您的数据、计算机等,因此结果可能会有所不同。但我看到“2.7e-1秒用于numpy数组比较”。但是无论如何,如果您使用大型阵列,结果在任何现代CPU上都不适用。@BS。我不应该知道,因为我没有测试它,我只使用问题中给出的数组。请在另一个问题中询问大型阵列的替代方案!无论如何,谢谢你发现我在过去两个月里耽误了计算时间,我更新了我的帖子。@jennej我也觉得基准有点不公平。如你所知,用小的可重复的例子提出问题是很常见的,而真正的问题可能有更大的规模。此外,您的比较可能会误导本页的未来读者,因为他们确实存在较大的问题。在我的机器上,
    np.clip
    比包含一百万个元素的数组的列表理解速度快250倍。作为建议,您可以为不同大小的数组运行基准测试,并说明使用列表理解在哪些范围内是可行的。
    a = [1, 100, 123, -400, 85, -98]
    a = [-100 if x<-100 else 90 if x>90 else x for x in a]
    
    a = [1, 90, 90, -100, 85, -98]