如果数组元素高于特定阈值,则将其设置为零

例如,我有一个由 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元素?

163011 次浏览
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])

一般来说,列表理解比 python 中的 for循环快(因为 python 知道它不需要关心在常规 for循环中可能发生的许多事情) :

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

但是,作为@unutbu 正确的 指出,numpy 允许列表索引,并且元素比较可以给出索引列表,所以:

super_threshold_indices = a > thresh
a[super_threshold_indices] = 0

会更快。

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

如果不想更改原始数组

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]: b
Out[4]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])


In [5]: a
Out[5]: array([ 2, 23, 15,  7,  9, 11, 17, 19,  5,  3])

从 Youtube 上的神经网络从头开始,他使用 np.maximum(0, [your array])使所有小于0的值变成0。

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