【问题标题】:Set numpy array elements to zero if they are above a specific threshold如果它们高于特定阈值,则将 numpy 数组元素设置为零
【发布时间】:2015-04-10 10:33:38
【问题描述】:

说,我有一个由10 元素组成的 numpy 数组,例如:

a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])

现在我想有效地将​​所有高于10a 值设置为0,所以我会得到:

[2, 0, 0, 7, 9, 0, 0, 0, 5, 3]

因为我目前使用的是for循环,非常慢:

# Zero values below "threshold value".
def flat_values(sig, tv):
    """
    :param sig: signal.
    :param tv: threshold value.
    :return:
    """
    for i in np.arange(np.size(sig)):
        if sig[i] < tv:
            sig[i] = 0
    return sig

考虑到10^6 元素的大数组,我怎样才能以最有效的方式实现这一目标?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    来自sentdex在Youtube上的神经网络系列从零开始,他使用np.maximum(0, [your array])将所有小于0的值都变成了0。

    对于您的问题,我尝试了np.minimum(10, [your array]),它似乎运行得非常快。我什至在一个 10e6 的数组(使用50 * np.random.rand(10000000) 生成的均匀分布)上完成了它,它在 0.039571 秒内工作。我希望这足够快。

    【讨论】:

      【解决方案2】:

      如果您不想更改原始数组

      In [1]: import numpy as np
      
      
      In [2]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
      
      
      In [3]: b = np.where(a > 10, 0, a)
      
      
      In [4]: a
      
      Out[4]: array([ 2, 23, 15,  7,  9, 11, 17, 19,  5,  3])
      
      
      In [5]: b
      
      Out[5]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])
      

      【讨论】:

        【解决方案3】:

        通常,列表推导比 python 中的for 循环更快(因为 python 知道它不需要关心在常规 for 循环中可能发生的很多事情):

        a = [0 if a_ > thresh else a_ for a_ in a]
        

        但是,正如@unutbu 正确的pointed out,numpy 允许列表索引和元素比较为您提供索引列表,所以:

        super_threshold_indices = a > thresh
        a[super_threshold_indices] = 0
        

        会更快。

        通常,在对数据向量应用方法时,请查看 numpy.ufuncs,它的性能通常比使用任何本机机制映射的 Python 函数要好得多。

        【讨论】:

        • 你的语句中需要一个 else:a = [0 if a_ > thresh else a_ for a_ in a]
        • @ben26941 真实数据。嗯,令人惊讶的是到目前为止没有人注意到。
        【解决方案4】:
        In [7]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
        
        In [8]: a[a > 10] = 0
        
        In [9]: a
        Out[9]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])
        

        【讨论】:

        • 完美答案。请注意,如果您碰巧关心元素的绝对值,则可以使用: a[np.abs(a) > 10] = 0
        • 有没有办法组合多个(比如 5 个)条件句?
        • @BrysonS。编写一个单独的函数,其中包含 5 个条件并返回一个布尔值。然后你可以像这样使用它:a[my_validation_func(a)] = 0
        • @AlexHall 能否展示一下 my_validation_func(a) 的返回结果如何?
        猜你喜欢
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2018-08-09
        • 2022-01-08
        • 2020-12-13
        • 1970-01-01
        • 2021-07-08
        • 2020-09-01
        相关资源
        最近更新 更多