【问题标题】:How to set the minimum and maximum value for each item in a Numpy array?如何为 Numpy 数组中的每个项目设置最小值和最大值?
【发布时间】:2019-07-30 15:56:00
【问题描述】:

假设我有一个 numpy 数组

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

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

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

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

【问题讨论】:

  • 嗨!您是否有不想使用列表理解的原因?
  • @jeannej 我认为它在速度方面效率低下
  • @ѕняєєѕιиgнι 实际上是相反的,我会发布一个答案来证明这一点
  • this link中的方法比较有用。

标签: arrays python-3.x numpy


【解决方案1】:

有几种方法可以做到这一点。首先,使用 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,请使用列表推导:

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]

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

  1. 列表理解需要 4.8e-3 秒
  2. numpy 数组比较需要 1.8e-1 秒
  3. np.clip 函数需要 2.7e-1 秒

很明显,如果以后不需要数组,列表推导式就是要走的路。如果您需要一个数组,直接比较的效率几乎是 clip 函数的两倍,而且可读性更强。

【讨论】:

  • 我不明白为什么这被选为最佳答案,同时具有误导性。如果您报告后者需要更少的时间来执行,直接比较如何比clip“更有效”?而且,列表推导是很酷的语法糖,但不是如果你有大型数组,其中矢量化是获得巨大加速的关键。在你的时间里,你很幸运,因为数组一开始就非常小。
  • @BS。我认为您错过了 4.8e-3 sec = 0.0048 sec 和 1.8e-1 sec = 0.18 sec...所以在我的测试用例中,列表理解 确实 需要更少的时间来执行。当然,时间比较取决于您的数据、计算机等,所以是的,结果可能会有所不同。
  • 但我看到“numpy 数组比较需要 2.7e-1 秒”。但无论如何,如果您使用大型阵列,结果不会在任何现代 CPU 上成立。
  • @BS。我不应该知道,因为我没有测试过,我只使用了问题中给出的数组。请随时在另一个问题中询问大型阵列的替代方案!无论如何,感谢您发现我在最后两个中插入了计算时间,我更新了我的帖子。
  • @jennej 我也确实觉得基准测试有点不公平。如您所知,提出具有可重复性小示例的问题是很常见的,而真正的问题可能规模更大。此外,您的比较可能会误导此页面的未来读者,他们确实有更大的问题规模。在我的机器上,np.clip 比对具有一百万个元素的数组的列表推导快 250 倍。作为建议,您可以针对不同大小的数组运行基准测试,并说明在哪些范围内使用列表推导是可行的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2018-01-30
    • 2021-06-20
    • 2012-04-13
    • 2019-02-10
    相关资源
    最近更新 更多