Belirli bir eşikten düşük olan öğeleri kaldırmak için bir diziyi filtrelemem gerekiyor. Şu anki kodum şöyle:
threshold = 5
a = numpy.array(range(10)) # testing data
b = numpy.array(filter(lambda x: x >= threshold, a))
Sorun, bunun lambda işlevli (yavaş) bir filtre kullanarak geçici bir liste oluşturmasıdır.
Bu oldukça basit bir işlem olduğu için, belki bunu verimli bir şekilde yapan bir uyuşukluk işlevi vardır, ancak ben bulamadım.
Bunu başarmanın başka bir yolunun diziyi sıralamak, eşiğin indeksini bulmak ve bu indeksten sonra bir dilim döndürmek olabileceğini düşündüm, ancak bu küçük girdiler için daha hızlı olsa bile (ve yine de fark edilmeyecek) ), girdi boyutu büyüdükçe kesinlikle asimptotik olarak daha az verimlidir.
Herhangi bir fikir? Teşekkürler!
Güncelleme : Ben de bazı ölçümler yaptım ve sıralama + dilimleme, girdi 100.000.000 giriş olduğunda saf python filtresinden iki kat daha hızlıydı.
In [321]: r = numpy.random.uniform(0, 1, 100000000)
In [322]: %timeit test1(r) # filter
1 loops, best of 3: 21.3 s per loop
In [323]: %timeit test2(r) # sort and slice
1 loops, best of 3: 11.1 s per loop
In [324]: %timeit test3(r) # boolean indexing
1 loops, best of 3: 1.26 s per loop