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

Python 如果numpy数组元素高于特定阈值,则将其设置为零,python,arrays,numpy,Python,Arrays,Numpy,比如说,我有一个numpy数组,它由10个元素组成,例如: a=np.array([2,23,15,7,9,11,17,19,5,3]) 现在我想有效地将所有高于10的a值设置为0,因此我将得到: [2,0,0,7,9,0,0,0,5,3] 因为我目前对循环使用,速度非常慢: # Zero values below "threshold value". def flat_values(sig, tv): """ :param sig: signal. :param tv:

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

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

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

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

因为我目前对
循环使用
,速度非常慢:

# 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
#零值低于“阈值”。
def平面_值(信号、电视):
"""
:参数信号:信号。
:param tv:阈值。
:返回:
"""
对于np.arange(np.sig)中的i:
如果sig[i]

我如何才能以最有效的方式实现这一点,同时考虑到大型数组,例如,
10^6
元素?

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

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])
但是,正如@unutbu所说的那样,numpy允许列表索引,而元素比较则提供索引列表,因此:

super_threshold_indices = a > thresh
a[super_threshold_indices] = 0
会更快


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

如果您不想更改原始数组

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])

完美答案。请注意,如果您碰巧关心元素的绝对值,您可以使用:a[np.abs(a)>10]=0是否有方法组合多个(比如5个)条件?@BrysonS。编写一个包含5个条件并返回布尔值的单独函数。然后您可以这样使用它:
a[my_validation_func(a)]=0
@AlexHall您可以演示my_validation_func(a)的返回是什么样子的吗?您的语句中需要一个else:a=[0 if a_>thresh else a_uufor a.@ben26941 true dat。嗯,令人惊讶的是到目前为止还没有人注意到。
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])