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

ѕня*_*gнι 9 arrays numpy python-3.x

假设我有一个 numpy 数组

a = np.array([1, 100, 123, -400, 85, -98])
Run Code Online (Sandbox Code Playgroud)

我想限制-100和之间的每个值90。所以基本上,我希望 numpy 数组是这样的:

a = np.array([1, 90, 90, -100, 85, -98])
Run Code Online (Sandbox Code Playgroud)

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

jea*_*nej 16

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

a = np.array([1, 100, 123, -400, 85, -98]) 
np.clip(a,-100,90)
Run Code Online (Sandbox Code Playgroud)

其次,使用 numpy 数组比较:

a = np.array([1, 100, 123, -400, 85, -98])
a[a>90] = 90
a[a<-100] = -100
Run Code Online (Sandbox Code Playgroud)

第三,如果您的其余代码不需要 numpy,请使用列表理解:

a = [1, 100, 123, -400, 85, -98]
a = [-100 if x<-100 else 90 if x>90 else x for x in a]
Run Code Online (Sandbox Code Playgroud)

他们都给出了相同的结果:

a = [1, 90, 90, -100, 85, -98]
Run Code Online (Sandbox Code Playgroud)

至于编码风格,我更喜欢 numpy 比较或列表理解,因为它们清楚地说明了做了什么,但这真的取决于你。至于速度,timeit.repeat在 100000 次重复后,我平均从最好到最差得到:

  1. 4.8e-3 秒用于列表理解
  2. 1.8e-1 秒用于 numpy 数组比较
  3. np.clip 功能为 2.7e-1 秒

显然,如果之后不需要数组,则列表理解是要走的路。如果你需要一个数组,直接比较的效率几乎是clip函数的两倍,同时更具可读性。

  • @jennej 我也确实觉得这个基准有点不公平。如您所知,用可重复的小例子提出问题是很常见的,而真正的问题可能规模更大。此外,您的比较可能会误导本页的未来读者,因为他们的问题规模确实较大。在我的机器上,“np.clip”比具有 100 万个元素的数组的列表理解快 250 倍。作为建议,您可以针对不同大小的数组运行基准测试,并说明对于哪些范围可以使用列表理解。 (3认同)