2015-02-10 2 views
9

Сай, у меня есть NumPy массив состоит из 10 элементов, т.е. .:Установить Numpy элементы массива к нулю, если они находятся ниже определенного порога

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

Теперь я хочу, чтобы эффективно установить все a значения выше чем 10 к 0, так что я получаю:

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

Как я могу добиться того, что в наиболее эффективном способе, ха ving в виду большие массивы, скажем, 10^6 элементов?

Потому что я имел обыкновение использовать 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 

Спасибо заранее.

ответ

6

Как правило, списочные быстрее, чем for петли в питона (потому что питон знает, что ему не нужно заботиться о многих вещах, которые могут произойти в обычном цикле for):

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

, но, как правильно @unutbu pointed out, NumPy позволяет список индексирования и поэлементно сравнение дает вам список индексов, так:

super_threshold_indices = a > thresh 
a[super_threshold_indices] = 0 

будет еще быстрее.

Как правило, при применении методов на векторах данных смотрите numpy.ufuncs, которые часто выполняют намного лучше, чем функции python, которые вы накладываете на карту, используя любой собственный механизм.

34
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]) 
+0

Отличный ответ. Обратите внимание, что если вам небезразлична абсолютная величина элемента, вы можете использовать: a [np.abs (a)> 10] = 0 –

Смежные вопросы