2013-02-09 21 views
6

Bazı eşikleri aşan 1D dizi sayısının tüm değerlerinin endekslerini ayıklamaya çalışıyorum. Dizi, 1e9 uzunluğundadır.Numfy'nin işlevini hızlandırın

Benim yaklaşım NumPy yılında şudur:

idxs = where(data>threshold) 

Bu yukarıya doğru kabul edilemez 20 dakika, bir şey alır. Bu işlevi nasıl hızlandırabilirim? Ya da daha hızlı alternatifler var mı?

(spesifik olmak gerekirse, bu bir Mac OS X üzerinde uzun 10.6.7, 1.86 GHz Intel, 4GB RAM başka hiçbir şey yapmadan çalıştıran sürer.)

+0

np.where'i çalıştırmak veya eşiğin altındaki değerleri silmek 20 dakika alır? –

+0

np.where'i çalıştırmak için 20 dakika sürer – mac389

+0

Her bir değişkeni bir sözlükten aradığım önemli mi? Yani 'data' gerçekten' data ['timeseries'] 'dır ve eşik gerçekten' data [eşik] [sivri] 'dir. İkinci değişkenin bir skaler olduğundan eminim. – mac389

cevap

4

bir mask array deneyin. Bu, aynı verilerin görünümünü oluşturur.

Yani sözdizimi olacaktır:

b=a[a>threshold] 

b (aksine) yeni dizi ama unsurlar endeksinde boole buluştuğu bir bir görünüm değildir.

Örnek:

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') 
Ben np.where ile aynı denedik 22.389815092086792 seconds


düzenlemek

yazdırır benim makinede On

ve sadece kadar hızlıdır. Şüpheli: Bu değerleri diziden mi siliyorsunuz?

+0

Eğer böyle yapıyorsam, bu istem dışı. Benim sözdizim seninkiyle aynı. Bir şeyi nasıl silebilirim? Daha yavaş zamanı açıklayacağına katılıyorum. – mac389