说,我有一个由10元素组成的numpy数组,例如:
a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
现在,我想有效地将​​所有高于a10值设置为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中的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,它通常比使用任何 native 机制映射的python函数要好得多。

关于python - 如果numpy数组元素高于特定阈值,则将其设置为零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28430904/

10-11 23:21
查看更多