J'essaye de créer un 'masque' d'un.numpy.array en spécifiant certains critères. Python a même belle syntaxe pour quelque chose comme ceci:Question d'indexation de Numpy.array
>> A = numpy.array([1,2,3,4,5])
>> A > 3
array([False, False, False, True, True])
Mais si j'ai une liste de critères à la place d'une gamme:
>> A = numpy.array([1,2,3,4,5])
>> crit = [1,3,5]
Je ne peux pas le faire:
>> A in crit
Je dois faire quelque chose basé sur les compréhensions de liste, comme ceci:
>> [a in crit for a in A]
array([True, False, True, False, True])
Ce qui est correct.
Maintenant, le problème est que je travaille avec de grands tableaux et que le code ci-dessus est très lent. Y a-t-il une façon plus naturelle de faire cette opération qui pourrait l'accélérer?
EDIT: J'ai été capable d'obtenir une petite accélération en transformant crit en set.
EDIT2: Pour ceux qui sont intéressés:
approche Jouni: 1000 boucles, le meilleur de 3: 102 ms par boucle
numpy.in1d: 1000 boucles, plus de 3 : 1,33 ms par boucle
Edit3: Just testé à nouveau avec B = randint (10, taille = 100)
approche de Jouni: 1000 boucles, le meilleur de 3: 2,96 ms par boucle
numpy.in1d: 1000 boucles, le meilleur de 3: 1,34 ms par boucle
Conclusion: Utilisez numpy. in1d() sauf si B est très petit.
ressemble à une addition récente à numpy (n'était pas dans la version 1.3) – Paul
Vous avez raison. J'ai seulement testé sur B ayant une longueur de 3. Si B est aussi grand, numpy.in1d () va certainement beaucoup mieux. – aduric
@aduric et ma seconde méthode est encore plus rapide que in1d. –