76 votes

Filtre de seuillage efficace d'un tableau avec numpy

J'ai besoin de filtrer un tableau pour supprimer les éléments qui sont inférieurs à un certain seuil. Mon code actuel est le suivant :

threshold = 5
a = numpy.array(range(10)) # testing data
b = numpy.array(filter(lambda x: x >= threshold, a))

Le problème est que cela crée une liste temporaire, en utilisant un filtre avec une fonction lambda (lent).

Comme il s'agit d'une opération assez simple, il existe peut-être une fonction numpy qui le fait de manière efficace, mais je n'ai pas réussi à la trouver.

J'ai pensé qu'une autre façon d'y parvenir pourrait être de trier le tableau, de trouver l'indice du seuil et de retourner une tranche à partir de cet indice, mais même si cela serait plus rapide pour les petites entrées (et ce ne sera pas perceptible de toute façon), c'est définitivement asymptotiquement moins efficace lorsque la taille de l'entrée augmente.

Des idées ? Merci !

Mise à jour : J'ai également pris quelques mesures, et le tri+découpage était toujours deux fois plus rapide que le filtre python pur lorsque l'entrée était de 100.000.000 entrées.

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

107voto

yosukesabai Points 2693

b = a[a>threshold] cela devrait faire

J'ai fait les tests suivants :

import numpy as np, datetime
# array of zeros and ones interleaved
lrg = np.arange(2).reshape((2,-1)).repeat(1000000,-1).flatten()

t0 = datetime.datetime.now()
flt = lrg[lrg==0]
print datetime.datetime.now() - t0

t0 = datetime.datetime.now()
flt = np.array(filter(lambda x:x==0, lrg))
print datetime.datetime.now() - t0

J'ai

$ python test.py
0:00:00.028000
0:00:02.461000

http://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X