2013-02-09 20 views
6

Próbuję wyodrębnić indeksy wszystkich wartości tablicy 1D liczb, które przekraczają pewien próg. Tablica ma długość rzędu 1e9.Przyspieszenie NumPy's gdzie funkcja

Moje podejście jest następujące w NumPy:

idxs = where(data>threshold) 

Trwa to coś w górę o 20 minut, co jest niedopuszczalne. Jak mogę przyspieszyć tę funkcję? Czy istnieją szybsze alternatywy?

(Mówiąc konkretnie, to trwa tak długo na Mac OS X 10.6.7 działa, 1,86 GHz Intel, 4GB RAM robi nic innego.)

+0

Trwa 20 minut, aby uruchomić np.where lub usunąć wartości poniżej progu? –

+0

Trwa 20 minut, aby uruchomić np.where – mac389

+0

Czy to ważne, że wywołuję każdą zmienną ze słownika? To znaczy. 'data' to tak naprawdę' data ['timeseries'] 'a próg to tak naprawdę' dane [próg] [spikes] '. Jestem pewien, że druga zmienna to skalar. – mac389

Odpowiedz

4

Spróbuj mask array. Spowoduje to utworzenie widoku tych samych danych.

więc składnia to:

b=a[a>threshold] 

B nie jest nowa tablica (w przeciwieństwie gdzie) ale w widoku z góry, w której elementy spełniają logiczną w indeksie.

Przykład:

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

Na moim komputerze, który drukuje 22.389815092086792 seconds


edit

próbowałem to samo z np.where, i to tak szybko. Jestem podejrzliwy: czy usuwasz te wartości z tablicy?

+0

Jeśli to robię, jest to niezamierzone. Moja składnia jest taka sama jak Twoja. Jak mogę usunąć coś? Zgadzam się, że wyjaśniałoby to wolniejszy czas. – mac389