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

blu*_*xel 34 python arrays numpy

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

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

现在我想有效地设置所有a值高于100,所以我会得到:

[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
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 86

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])
Run Code Online (Sandbox Code Playgroud)

  • @BrysonS.编写一个包含5个条件的单独函数,并返回一个布尔值.然后你可以像这样使用它:`a [my_validation_func(a)] = 0` (4认同)
  • 完美的答案。请注意,如果您碰巧关心元素的绝对值,则可以使用:a [np.abs(a)&gt; 10] = 0 (3认同)

Mar*_*ler 30

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

a = [0 if a_ > thresh for a_ in a]
Run Code Online (Sandbox Code Playgroud)

但是,正如@unutbu正确指出的那样,numpy允许列表索引,并且元素方式比较为您提供索引列表,因此:

super_threshold_indices = a > thresh
a[super_threshold_indices] = 0
Run Code Online (Sandbox Code Playgroud)

会更快.

通常,在数据向量上应用方法时,请查看numpy.ufuncs,这通常比使用任何本机机制映射的python函数执行得更好.


yel*_*w01 11

如果您不想更改原始数组

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])
Run Code Online (Sandbox Code Playgroud)