2013-02-09 2 views
6

Я пытаюсь извлечь индексы всех значений 1D массива чисел, которые превышают некоторый порог. Массив имеет длину порядка 1e9.Ускорить NumPy где функция

Мой подход заключается в следующем в NumPy:

idxs = where(data>threshold) 

Это что-то берет вверх 20 минут, что является неприемлемым. Как я могу ускорить эту функцию? Или, есть ли более быстрые альтернативы?

(для определенности, он принимает, что долго на Mac OS X 10.6.7 работает, 1,86 ГГц Intel, 4 Гб оперативной памяти ничего не делая.)

+0

Требуется 20 минут для запуска np.where или для удаления значений ниже порогового значения? – 2013-02-09 22:00:25

+0

Требуется 20 минут для запуска np.where – mac389

+0

Имеет ли значение, что я вызываю каждую переменную из словаря? То есть 'data' действительно' data ['timeseries'] 'и порог - это действительно' data [threshold] [spikes] '. Я уверен, что вторая переменная является скаляром. – mac389

ответ

4

Попробуйте mask array. Это создает представление о тех же данных.

Так синтаксис будет:

b=a[a>threshold] 

б не новый массив (в отличие от куда), но вид, где элементы отвечают булево в индексе.

Пример:

import numpy as np 
import time 

a=np.random.random_sample(int(1e9)) 

t1=time.time() 
b=a[a>0.5] 
print(time.time()-t1,'seconds') 

На моей машине, которая печатает 22.389815092086792 seconds


редактировать

Я попробовал то же самое с np.where, и это так же быстро. Я подозрительный: вы удаляете эти значения из массива?

+0

Если я так делаю, это непреднамеренно. Мой синтаксис такой же, как у вас. Как я могу что-то удалить? Я согласен, что это объяснит более медленное время. – mac389

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